気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
IoT・電子工作

CとArduinoでLチカ

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

CとArduinoでLチカ

CとArduinoでLチカ

2018/03/10

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

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

 ここでは、この中からC言語とFirmata用CクライアントライブラリFirmataCを使わせて頂き、Arduino界のHello World!であるLチカ(blink)を実行するまでの手順を書く。

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

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

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

make・Cの実行環境構築

 UNIX/*BSD/Linux/macOSでは、makeやCに関して特別準備しておくことはないが、Windowsの場合には、Cygwin/MinGW(Visual Studio+make on Windowsなどでもできる?)の環境構築が必要かもしれない。

 ちなみに自身は、Debianを使わせて頂いている。

ライブラリ全体のmake

$ cd path/to/FirmataC
$ make
$ ...

 gitやブラウザで先のリンク先からFirmataCライブラリをダウンロード、任意のディレクトリ(フォルダ)に置いたら、そのrootに移動。

 そこでmakeすると当該ディレクトリ内に[libfirmatac.a]、src/内に各Cソースファイル用のオブジェクトファイル(.o)が生成される。

$ cd examples
$ less ledBlink.c
$ ...
$ less servoTest.c
$ ...
$ make
$ ...

 続いて、その下のexamplesディレクトリに移動、使う方だけでも良いが、Cソースファイルを眺めてArduinoボードを接続したシリアルポートと同一ならそのまま、異なる場合には、適切なシリアルポートに、オンボードLED用のデジタルピンが[13]でない場合には、書き換え・編集。

 ちなみにデフォルトでは、シリアルポートは、LinuxにおいてAtmega16U2+Atmega328P搭載のArduino Unoを接続した場合に使われる[/dev/ttyACM0]となっているが、今回は、Atmega16U2のないUno互換機を使ったので[/dev/ttyUSB0]とした。

 準備が整ったら、ここでmakeすると当該ディレクトリ内に各Cソースファイルと同名の実行ファイル(拡張子は.ex、拡張子が気持ち悪ければMakefileを編集)が生成される。

C実行ファイルの実行と終了

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

 シリアルポートは、固定なのでArduinoボードで使っているものを予め確認して必要ならソースコードを編集の上、makeしてできたC実行ファイルを使う。

$ ./ledBlink.ex
Opening device at: /dev/ttyUSB0
Device opened at: /dev/ttyUSB0
Name :: StandardFirmata.ino-2.5
Setting pinMode at: 13 with value: 1
Writting digitalWrite at: 13 with value: 0
Writting digitalWrite at: 13 with value: 1
Writting digitalWrite at: 13 with value: 0
Writting digitalWrite at: 13 with value: 1
...
[Ctrl+C]
$

 実行ファイルの前に[./]を置けば、探索パスになくても実行できる(生成された実行ファイルには実行権限が付与されているはずだが、当然、実行権限は必要)。

 実行中、端末上では、指定したシリアルポートにアクセス、接続できたこと、StandardFirmata.inoのバージョン?、初期値としてD13を1にすべくpinMode設定したことが表示された後、[D13]ピンに対して[value:0]/[value:1]出力で[digitalWrite]すべく、書き込み中である旨が繰り返し表示される。

 無限ループ状態なので終了するには、キーボードの[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とC

 Arduino IDEのプログラミングスタイルはC++ベースなので基本、Cとも相性は良い。

 自身の経験値では、にわかには思いつかないが、シリアル通信越しであるため、高速通信は厳しいにしてもCでもArduinoを操作可能であれば、何かの役に立つことがあるかもしれない。

備考

 何れにしても、それほど詳しいわけでもないが、C/C++/Javaだと自身は、Cが最も身近、続いてちょっと触れたことはある程度のJava、C++...かな。

 趣味ベースもC++は脳内整理が追いつかず...離脱、Javaは、なくなるどころか、減速すらしなかったようだが、Oracleがxxした時点でいつなくなるかもわからないし、と興味が失せた経緯が...。

 何れにしても今回のようにライブラリを使わせて頂くだけなら、できるできないも何もないが...。