気の向くままに辿るIT/ICT/IoT
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]ボタン同時押しで強制終了させます。

ArduinoとC

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

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

備考

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

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

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

ホーム前へ次へ