気の向くままに辿るIT/ICT/IoT
webzoit.net
IoT・電子工作

PerlとArduinoでLチカ

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
Arduinoって?

PerlとArduinoでLチカ

PerlとArduinoでLチカ

2018/02/27

 PerlとArduinoでLチカを実行してみるページ。

 Arduino IDEは、C/C++ベースだが、このIDEには、ArduinoとPCやRaspberry Piなどとの間をシリアル通信で接続して操作できるFirmataプロトコルを使ったサンプルスケッチ群があり、例えば、これをArduinoボードに書き込んでおけば、PythonProcessingRubyPerl、JavaScript...などのスクリプトやC/C#などのプログラミング言語からでもArduinoを操作・制御することができるようになる模様。

 ここでは、この中からPerlとperl_firmataライブラリを使わせて頂き、Arduino界のHello World!であるLチカ(blink)を実行するまでの手順を書く。

ArduinoボードにStandardFirmataをアップロード

 もちろん、後でもよいが、今回は、まず、ArduinoボードにArduino IDEのサンプルスケッチStandardFirmataをアップロードしておくものとする。

 サンプルスケッチStandardFirmataは、Arduino IDEの[ファイル/File] => [スケッチ例/Examples] => [Firmata]にある。

Perlのインストール

 公式サイトのPerl Downloadから使用中のOS用のPerlを、もしくは、リポジトリにあるならそれをインストールする。

perl_firmataのインストール

$ cd path/to/perl-firmata-master
$ perl Makefile.PL
$ ...
$ make
$ ...
$ make test
$ ...
$ sudo make install
$ ...
$

 ntruchsess/perl-firmataからzipファイルをダウンロードすると共にリンク先の通りにインストールする。

$ cd path/to/Device-SerialPort-1.04
$ perl Makefile.PL
$ ...
$ make
$ ...
$ make test
$ ...
$ sudo make install
$ ...
$

 尚、もしかして...と思いつつも、だいぶ悩まされたのだが、Device::SerialPortも併せてダウンロード、READMEファイルにある通りにインストールする。

 これがないと[Can't locate object method "new"...]というエラーにはまってしまうので注意。

 結果、SerialPort.pmは、/usr/local/lib/i386-linux-gnu/perl/5.24.1/Device/以下にインストールされたが、他にコピーしたり、ソフトリンクを張ったりするする必要はなかった。

スクリプトを書く

// example.pl
#!/usr/bin/perl
 
use strict;
use lib '../lib';
use Data::Dumper;
use Device::Firmata::Constants qw/ :all /;
use Device::Firmata;
$|++;
$Device::Firmata::DEBUG = 1;
use Time::HiRes 'sleep';
 
my $led_pin = 13;
 
my $device = Device::Firmata->open('/dev/ttyUSB0') or die "Could not connect to Firmata Server";
$device->pin_mode($led_pin=>PIN_OUTPUT);
my $iteration = 0;
while (1) {
 my $strobe_state = $iteration++%2;
 $device->digital_write($led_pin=>$strobe_state);
 #select undef,undef,undef,1;
 sleep 0.5;
}
 

 ソースコードは、example-blink.plをコピー&ペーストしただけ。

スクリプトの実行と終了

 Arduino IDEのサンプルスケッチStandardFirmataをアップロードしたArduinoボードをPCにUSB接続しておく。

 シリアルポートは、固定なのでArduinoボードで使っているものを予め確認して必要ならソースコードを編集しておく。

$ perl example.pl
>f0,79,f7
>f9,00,00
 <a9,83,90,00,92,fe
  < UNKNOWN
>f0,79,f7
>f9,00,00
...
[Ctrl+C]
$

 perlにファイル名を引数として渡せば、実行権限がなくても実行できる。

 実行中、端末上では、ON、OFFが繰り返され、今回はUno互換機を使ったが、少なくともNanoやPro Miniなどなら、Arduinoボード上のLEDが点滅しているはず。

 breakさせておらず、無限ループ状態なので終了するには、キーボードの[Ctrl]+[C]ボタン同時押しで強制終了させる。

EasyWordMall Arduino UNO R3互換ボード(USBケーブル付属)

EasyWordMall Arduino Pro Mini互換ボード Atmega328 5V 16MHz

Rasbeeオリジナル FT232RL互換 3.3V/5V FTDI/USB/TTL変換アダプタ

KKHMF Arduino Nano Ver 3.0互換ボード ATmega328P CH340G 5V 16MHz

ArduinoとPerl

 シリアル通信越しであるため、高速通信は厳しいにしてもPython/Perl/Rubyなどのインタプリタのスクリプト言語やNode.jsなど今時のJavaScriptフレームワークなどでArduinoを操作可能になると電子工作からIoTへの架け橋の役割もあり、できることの幅が広がるだろう。

備考

 Python/Perl/Ruby/JavaScriptだと自身は、それほど詳しいわけでもないがPerlが最も身近、続いて(昔のクライアントサイドの)JavaScript、PythonはJavaと共に超初心者レベル、Rubyについては門外漢。

 ただ、JavaScriptはさておき、Arduinoを楽しむ上でPython/Perl/Rubyの内、何れかは使っていくことになるだろうということで今更ながら基本中の基本Lチカのやりやすさで決めようかと比較検討中。

 ここでは、これまで最も身近だったPerlを使ってみたが、ソースコードからするとJavaScriptもそうだが、Python、Rubyの方が明らかに少ない記述で書くことができ、エレガントという印象。

ウェブ造ホーム前へ次へ