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. $