8.Arduinoプログラミング文法とクムクムボードの基礎知識

ここからはいよいよArduinoでのC言語プログラミングです。このサイトではプログラミング文法やC言語についての基礎が理解できるという前提で学習を進めていきます。

Arduinoプログラミングの基礎知識

ArduinoIDEを起動すると、必ず下記の2つの関数 (setup , loop)が表示されます。
C言語に必ずある main 関数はどこにも見当たりません。
実は Arduinoでは mainは、まったく別の見えないところですでに使われてしまっていて、そのmainから下記の setup と loop が呼び出される構造になっています。
ですから、Arduinoはこの2つの関数からプログラムを行うことになります。
※setupとloopは消すとプログラムが動かなくなります。
※万が一操作ミスで消してしまったときは、自分で同じように描き加えて下さい。

setup関数

Arduinoまたはクムクムに電源が入り main が起動されると、必ず1回だけこの関数が内部でコールされます。

ここに、1回だけ動けばよい処理を記述します。

ほとんどの場合は、ポートの入出力のセットや、グローバル変数の初期化などになると思われます。

loop関数

この関数はArduinoのmain関数の中で無限ループで呼ばれる関数です。
ですので、ここに書いた処理は何度も何度も繰り返し実行されることになります。
つまり、Arduinoのプログラムは、電源が切れるかスイッチがOFFになるまでは終わりなく動き続けるプログラムということです。

C言語でイメージを書いてみると

int stat = 0;
void main(void){
    while(1){
        if(start == 0){
             setup() ;
             start = 1 ;
       }
       loop() ;
    }
}

クムクムボード構成とパーツ接続とその機能

クムクムのメインボードとパーツの構成は下記の図の通りです。
メインボードと周辺のパーツはケーブル(ハーネスとも呼ぶ)で接続されています。
信号の流れについて、入力と出力、そしてボード内でもI2CやSerialといった通信接続をしています。

メインボードとパーツ接続図

クムクムを動かす場合、モーターを使わない場合はアルカリ電池でも構いません。
しかし、モータを動かすプログラムの場合は、必ずエネループなどのニッケル水素充電電池を使ってください。
その理由は。サーボモータは回転させるときにとても多くの電流を必要とします。
クムクムで使用しているモータも、数アンペアという電流が必要になります。
それだけ多くの電流は、ニッケル水素やリチウムなどの電池でしか供給することができません。
アルカリ電池を使用した場合、一瞬動かすことができたとしても、その大きな電流でCPUまで電流が回らずに思ってもいない動きになったり、また電力不足でリセットがかかったりしてしまう可能性があるからです。

ポート番号とCPU

クムクムのパーツとArduinoのピン番号やCPUのピン番号は下記の表のようになっています。
クムクムをお持ちではない方は、下記のポート表を参考に、ブレッドボードに接続して学習を進めることも可能です。


※ATMEGA32U4データシート3Pより抜粋

ArduinoLeonardoにパーツを接続するイメージ

パーツの機能

使用しているパーツの名称や機能は下記のとおりです。

パーツ名称 機能・特長・できること
CPU ArduinoLeonardoに使用されているATMEGA32U4を使っています。
出荷時にはArduinoLeonardoのブートローダと【遠隔操作プログラミング】用のファームウエアが書き込まれています。
ユーザによるプログラムは、USB経由でArduinoIDEから書き込むことができます。
ユーザプログラムを描きこむと、工場出荷時のファームウエアは上書きされて消えます。
【遠隔操作プログラミング】を可能としたい場合は、クムクムホームページからファームアップデータをダウンロードし、最新ファームを書き込みます。
TTS TextToSpeachの略で、入力されたテキストデータから、音声合成波形を使い言葉を喋らせることができるLSIです。
クムクムでは、株式会社アクエスト様の AquesTalkPicoLSI(ATP3012) を使用しています。
メインCPUとはI2Cバスによって接続し、AudioAMPからボリュームを通して外部スピーカからおしゃべり声を出力します。
ユーザープログラムではArduinoのI2Cライブラリーを使用してコントロールします。
コマンドなどは AquesTalkPicoLSIデータシート そのままを利用することができます。
BEEP ATMEGA32U4のポートから直接矩形波を取り出し、そのままAudioAMPからボリュームを通して外部スピーカから単音を出力します。
ArduinoのライブラリーではTone関数をそのまま利用することができます。
MIC コンデンサーマイクからMicAMP(OPA344)を通じてCPUのアナログポートへそのままの信号を入力しています。
音のレベルは、512を中心に0方向と1023方向にサイン波として入力されるため、ユーザープログラムではその信号で音の検知を処理します。
あくまで信号の検知のみで、音声データの入力には対応していません。
超音波距離センサー Arduinoの制作記事では一般的に使われるHC-SR04という比較的安価な距離センサーをそのまま利用しています。
参考記事① 参考記事②
サーボモータ 基板の下側にある7個のヘッダピンには、クムクムの7個のサーボモータっを接続しています。
クムクムでは、jxservoのサーボモータをオリジナルカスタマイズしたOEM品を使用しています。
Arduinoライブラリーでは、Servoクラスを利用して簡単にコントロールすることが可能です。
モータ電源コントロール サーボモータへの電源供給をプログラムによって自由にON/OFすることができます。
※個別にON/OFFすることはできません。
電池電圧監視 電池電圧約5Vを1/2にした約2.5Vをアナログポートに取り込んでいます。
BLE Microchip社BLEモジュールRN4020によりBluetooth通信が可能です。
クムクムでは、PC側の通信機と1:1で通信するようにMLDP通信方式によってコマンド授受を実現しています。
ユーザプログラミングでは自由にコントロールが可能なため、スマホや外部のBluetooth機器を使ったコントロールが実現できます。

クムクム(Qumcum)補足

このサイトでは、CPUにプログラムを直接焼きこむ【組み込み】プログラミングについて説明をしていきますが、クムクムはその他もうひとつのプログラミングモードを持っています。

【遠隔操作モードプログラミング】

このモードでプログラミングを行うために、CRETARIA社からは、スクラッチ2.0/3.0からリアルタイムに動作させるためのエクステンション付きプログラミングアプリと、Pythonから動作させるための専用APIが提供されています。

遠隔操作モードプログラミングのメリットは、ユーザがつくるプログラムをクムクムのボードに流し込む必要がないため手軽にプログラムを試せることです。

クムクムは常にBLEモジュールと通信を行い、BLEを通じて受信されるPCからのコマンドを順次解析しながらロボットのパーツをリアルタイムに動かします。
そのため、プログラムを試しながら直ししながらどんどん実験モードで目的のプログラムを作ることができます。

しかし、デメリットとして、ロボットとPCとの間はBLE、ロボットボード内ではBLEモジュールとCPUとの間の合計2つの通信が動くため、通信による速度遅延も発生、組み込み型のプログラムより動作は相当遅くなります。

また、動作が遅くなる分プログラミングによって可能な動きにも制限が多くなります。
もっと大きな問題は、PCの電源が入っていて作ったプログラムが送信されていないと動かないことです。

コメント