現在の閲覧者数:

Arduino_簡易コントロール

Arduino_簡易コントロール

PrologでArduinoマイコンボードをコントロールします。
Prologから直接シリアル通信の信号を出す方法が分からなっかたので
Linux(Debian)のシェル端末から Ruby:シリアル通信ができるようにして
ppp.txtに文字'o'を追記するとLED13がON。'p'を追記するとLED13がOFFする
(↑ 追記に限ります。)
仕組みを作りました。

別スレッドで(シェル端末2つ目起動)
Prologプログラムを起動して
'ledon.'
'ledoff.'
コマンドを発行することで、LED13をON_OFF制御できます。
<<単に、ppp.txtに'o'または'p'を1行ずつ追記しています>>

♪ 全プログラムコードは次の3つです。
arduino_control_0.ino
arduino_control_0.rb
arduino_control_0.pl


♪プログラムコード(Arduino)
code

このスケッチコードをArduinoへ書き込みます。

$ cat arduino_control_0.ino
// 変数の定義
#define LED_PIN 13
 
// 初期化
void setup(){
  pinMode(LED_PIN, OUTPUT);
 
  // シリアルポートを9600 bps[ビット/秒]で初期化 
  Serial.begin(9600);
}
 
// 繰り返し処理
void loop(){
  int inputchar;
 
  // シリアルポートより1文字読み込む
  inputchar = Serial.read();
 
  if(inputchar != -1 ){
    // 読み込んだデータが -1 以外の場合 以下の処理を行う
 
    switch(inputchar){
      case 'o':
        // 読み込みデータが o の場合
 
        Serial.print("LED ON\n");
        digitalWrite(LED_PIN, HIGH);
        break;
      case 'p':  
        // 読み込みデータが p の場合
 
        Serial.print("LED OFF\n");
        digitalWrite(LED_PIN, LOW);
        break;
    }
  } else {
    // 読み込むデータが無い場合は何もしない
  }
}




♪プログラムコード(Ruby: シリアル通信)
code
$ cat arduino_control_0.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'serialport'

if ARGV.size < 1
  puts 'ruby ruby-serialterm.rb /dev/tty.usbmodem411'
  exit 1
end

# 9600bps, 8bit, ストップビット1, パリティ無し
sp = SerialPort.new(ARGV.shift, 9600, 8, 1, SerialPort::NONE)

Thread.new{
  loop do
    line = sp.readline # 改行コード毎に読み込み
    puts line
  end
}

f = open( "./ppp.txt",  mode="r")
loop do
   # f.sysseek(0)
  line = f.gets
  sp.write line
end
sp.close
f.close




♪プログラムコード(Prolog)
code

$ cat arduino_control_0.pl

ledon :- open('ppp.txt', append, Handle), write(Handle, 'o'), close(Handle).

ledoff :- open('ppp.txt', append, Handle), write(Handle, 'p'), close(Handle).

if( Test, Then, _    ) :- Test, !, Then.
if( _,    _,    Else ) :- Else.

実行例
コンソール端末を2つ起動して
つぎのようにRubyプログラムとPrologプログラムをそれぞれ実行します。

※ Arduinoボードをつながずに
$ ls /dev > aaa
※ ArduinoボードをUSBにつないで
$ ls /dev > bbb
$ diff aaa bbb
63a64
> serial
143a145
> ttyUSB0
※上の表示を参考に次のコマンドを実行します。
$ touch ppp.txt
$ ruby prolog_control_serialport.rb /dev/ttyUSB0
※エラーが出ないことを確認して、別のシェル端末への操作に移ります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$ swipl -qs arduino_control.pl
?- ledon.         ※Arduino_LED13_ON
true.

?- ledoff.        ※Arduino_LED13_OFF
true.

?- if( true, ledon, ledoff ).  ※Arduino_LED13_ON
true.

?- if( false, ledon, ledoff ). ※Arduino_LED13_OFF
true.

?- halt.
$
inserted by FC2 system