👍

Arduinoとmbedのいいとこどりをしたい!!!

2024/10/20に公開

初めに

Arduinoとmbedどちらを使う?(メリット編)Arduinoとmbedどちらを使う?(デメリット編)とマイコンについて考えてきたのですが、「結局どっちがいいの?」という話に対し一つの折衷案として、両立を考えてみる。

Arduinoだけでは...

can通信を手軽に扱えない。それに、やはりロボコン的視点だとやはり高性能なmbedマイコンを使いたい!!!

mbedは...

しかし、mbedはc++やオブジェクト指向を強制されるので敷居が高い上になれないと難しい。また、libraryも多くないから簡単に書けない

結論どっちも使おう!!!

自分はArduinoのlibraryを使って無線モジュールやLCDを使用し、mbedでロボマスターなどを用いるロボット本体(足回り、ハンド)を動かすのをお勧めする。

どの通信方式を利用するのか

  • UART
    実はArduinoとmbedでは一般的なシリアル通信であるURATの仕様が大きく異なる。
    Arduinoが5Vでの通信を行うのに対し、mbedは3.3Vで通信を行うため、通常のマイコン間通信のようにTX-RX接続を使った通信はうまくいかない。
  • CAN
    自分の記事では多く取り上げているcan通信だが、そもそもArduinoが対応していないので論外
  • I2C
    今回最もおすすめしたい通信方式、プルアップ抵抗が必要となるが簡単に接続し、高速通信できる。
    通信距離が短いことがネック
  • SPI
    I2Cよりも高速な通信方式
    しかし、とにかく配線が多いため、ピン数が少ないArduinoにはきつい。

Arduino、mbed間I2C

どうしてI2C?

  • ID管理することができる
  • 割り込みを利用して通信できる
  • 配線が簡単

とりあえず書いてみる

今回はArduino側で100msごとにカウントを行い、そのカウントをmbed側で時間表示にしてみるというコードを書いてみます。また、回路などはArduinoとmbedのSDA、SCLをつなぎプルアップ抵抗(1~2.2kΩ)をつなげばよいので省略。

Arduino側

ArduinoにはI2CのlibraryであるWire.hがあるため簡単に利用できる。
今回はArduino側をSlaveにして利用します。
コードはこちら

#include<Wire.h>

int time = 0;//時間をはかる

void setup(){
    pinMode(A4, INPUT);
    pinMode(A5, INPUT);
    Wire.begin(8);
    Wire.setClock(400000);
    Wire.onRequest(cb);
}

void cb(){
    char msg[2] = {(int)(time/10),time%10};//秒とミリ秒に分解
    Wire.write(msg,2);
}

void loop(){
    time++;
    delay(100);//100ms ごとにカウント
}

mbed側

mbedにもI2C用のclassが存在しており、master側で利用する場合はread関数を使うことでArduino側にRequestを飛ばすことができます。
今回はST-Nucleo-F303K8を利用します。

#include "mbed.h"

I2C master(D4,D5);

int main(void){
    while(1){
        char msg[2];
        master.read((8<<1),msg,2);
        printf("%d.%d",msg[0],msg[1]);
        wait_us(1000000);
    }
}

終わりに

今回はArduinoとmbedをI2C通信を用いていいとこどりをすることを目指しました。この方法は結構実用的で、特にArduinoをATMEGA328P-PUを使うことで小型化すると便利に感じます。
ロボコンなどの機体に複数のモジュールが乗る場合などはArduinoが便利ですが、mbedのような高度な処理が必要になるときがあります。(最近はミニPCをのせ、rosなどを使うことが多いですが...)そのような時にmbedへI2Cを使って、すべてのデータを集めることができ、便利な技なのでぜひ利用してみてください。

Discussion