コマンドラインでネットから ino ファイルをダウンロードして置換して Arduino ボードに書き込みをする


コマンドラインでネットから ino ファイルをダウンロードして置換して Arduino ボードに書き込みをします。

まずは前提条件として、arduino-cli のインストールが必要になります。

curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh ;
sudo cp ~/bin/arduino-cli /usr/local/bin/arduino-cli ;

次に php などからも arduino の USB シリアルポートにアクセスができるように権限を変更します。

sudo chmod 777 /dev/ttyUSB0 ;

アップロード用の置換前の arduino のスケッチファイル。LED が 0.1秒ごとにチカチカします。

led_100.ino
void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(100);
    digitalWrite(LED_BUILTIN, LOW);
    delay(100);
}

これを 3秒ごとにチカチカするようにPHPで変更してコマンドラインでアップロードをします。

index.php
<?php

$url_ino      = "led_100.ino"; // or http://hogehoge.github/hoge.ino
$replace_from = array("100");
$replace_to   = array("3000");

//system( "ls /dev/ttyUSB*");

$project_name     = basename($url_ino, ".ino");
$project_name_ino = "{$project_name}/{$project_name}.ino";

//
@chmod( $project_name , 0777 );
@mkdir( $project_name );
@chmod( $project_name , 0777 );

$page_ino          = file_get_contents( $url_ino );
$page_ino_replaced = str_replace( $replace_from , $replace_to , $page_ino );

//
@chmod( $project_name_ino , 0777 );
file_put_contents( $project_name_ino , $page_ino_replaced );
@chmod( $project_name_ino , 0777 );

// sudo cp ~/bin/arduino-cli /usr/local/bin/arduino-cli
// sudo chmod 777 /dev/ttyUSB0

# compile and update
$cmd_compile = "arduino-cli compile --fqbn arduino:avr:nano {$project_name_ino}";
system( $cmd_compile );

$cmd_upload = "arduino-cli upload -p /dev/ttyUSB0 -b arduino:avr:nano:cpu=atmega328old {$project_name}";
system( $cmd_upload );

実行

php index.php

これで、本来は 0.1秒ごとのチカチカが 3秒ごとのチカチカになっているかと思います。

応用例としては、複数のボードのIPアドレスやMacアドレスの管理、UUIDの指定ができます。
どうしても静的なプロジェクトファイルになりがちなinoファイルを動的に書き換えられるようになるかと思います。

Arduino ってどういうのを書き込んだか忘れるので githubでソースコード、PHP とデータベースで固有番号を付与して管理してもよいでしょう。