Arduino学 Ⅰ

目次

この資料の目的

 この資料は研究室の新人向けに作成したものです。c言語を勉強したことがある人向けにArduinoでできることをできる限り簡単に説明することを目的としています。そのためわかりやすさを優先するために説明を省略している場合があります。

Arduinoとは

 マイクロコントローラ(マイコン)の一種です。一番よく使われているマイコンです。ですからネットで検索すればたいていのことが分かります。わからなかったらとりあえずググりましょう。またArduinoにはいくつか種類があります。一番有名なのはUNO、MICROは小さいといった感じです。ArduinoArduino言語というプログラミング言語で書きます。Arduino言語はc言語と親戚です。例えると標準語と方言のような関係です。

Arduino(マイコン)でできること

 Arduinoでできることは大まかにいうと電圧を出力すること、電圧を読み取ることです。基本的には電圧がかかっているかかかっていないかという2通りで出力、読み取りを行います(2進数)。出力するタイミングを制御することでセンサの読み取りやモータの制御を行っています。

Arduinoの使い方

準備

 Arduinoのソフトウェアをインストールしましょう(ダウンロード)
インストールしたらソフトを起動します。PCとArduinoを接続します。ツールからボード、シリアルポートを設定します。以上で準備ができました。

Arduinoを動かしてみよう

1. シリアルモニタに表示

 結果を確認したいときやデバックをする際に使います。これを適切に使えるようになるとデバックが早くなります。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.print('a');
}

void loop() {
  // put your main code here, to run repeatedly:
  
}

こうすることでシリアルモニタに表示できます。

プログラムの説明
  • void setup()(一行目の”{”から5行目の”}”で囲まれた範囲)は最初の一回だけ実行されます。
  • void loop()(7行目の”{”から10行目の”}”で囲まれた範囲は繰り返し実行されます。
  • 3行目のSerial.begin(9600);はシリアル通信の初期設定をしています。
  • 4行目のSerial.print('a');は文字を表示するためのプログラムです。(c言語はprintfでした。)
    練習

    以下の項目をやってみましょう

  • 繰り返し表示
  • 複数の文字(aaa)を表示
  • 数字を表示
  • 変数を表示
  • 改行
  • 2進数を表示
  • 文字と数字、文字と変数などを組み合わせて表示(print関数を複数使う)
  • シリアルブロッタ

2. シリアルモニタから入力

出力を変えたり、プログラムの分岐で使います。

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {

    char data = Serial.read();
    Serial.print(data);
  }
}

プログラムの説明
  • 6行目のSerial.available() > 0:入力があるかどうかを調べる
  • 8行目のSerial.read(); :読み取り
  • 9行目のSerial.print(data); :表示
    練習
  • 変数の型をcharからintにしてみよう(ASCIIコード)(シリアルモニタの右下の改行なしとかのところによって結果が変わる)

3. 電圧出力

const int LED_PIN = 13;

void setup() {
  pinMode( LED_PIN, OUTPUT );
}

void loop() {
  digitalWrite( LED_PIN, HIGH);
  delay( 1000 );

  digitalWrite( LED_PIN, LOW);
  delay( 1000 );
}

ArduinoのLEDが点滅します。

プログラムの説明
  • 1行目のconst int LED_PIN = 13;:変数に代入しています。(c言語と同じですね)
  • 4行目のpinMode( LED_PIN, OUTPUT );:13ピンを出力として使うことを宣言
  • 8行目のdigitalWrite( LED_PIN, HIGH);:電圧ON
  • 9行目のdelay( 1000 );:1000ms(1s)待機
  • 11行目のdigitalWrite( LED_PIN, LOW);:電圧OFF
    練習
  • ONOFFのタイミングを変えてみましょう
  • 8行目のHIGHと11行目のLOWは別の書き方があります。

4. PWM

 Arduinoの出力ピンは5Vしか出せません。では3V出したいときはどうすればよいでしょうか?
一つの方法としてPWM(Pulse Width Modulation)というものがあります。高速でONとOFFを繰り返すことで電圧が変わっているのと同様の結果を引き起こす方法です。

int PIN = 3; 
float V = 2.0;
int DUTY = V * 51;

 void setup(){
   pinMode(PIN, OUTPUT); 
 }
 
 void loop(){
   analogWrite(PIN, DUTY);
}

テスターで測ると約2V出力されていることが確認できます。

プログラムの説明
  • 3行目のint DUTY = V * 51;:電圧をデューティ比に変換しています。
  • 10行目のanalogWrite(PIN, DUTY);:PWM出力
    練習
  • ピンを変えてみよう(~がついているピンがPWMが使える)
  • 電圧を変えてみよう
  • V * 51 を説明してください
  • ほかの電圧を制御する方法を考えてみてください

5. 電圧読み取り

 ボタンのON、OFF判定などに使います。

const int DIN_PIN = 4;

void setup(){
    pinMode( DIN_PIN, INPUT );
    Serial.begin( 9600 );
}

void loop(){
    int value;
    
    value = digitalRead( DIN_PIN );
    Serial.println( value );

    delay( 1000 );
}

4ピンとグラウンドをつなぐと0、5Vをつなぐと1が表示される

プログラムの説明
  • 4行目のpinMode( DIN_PIN, INPUT );:入力に設定
  • 11行目のvalue = digitalRead( DIN_PIN );:読み取り
    練習
  • ピンを接続しないと0になったり1になったりしてしまいます。これを解決しましょう。(PULLUP、PULLDOWN)
  • PWMと組み合わせてみましょう(PWMの様子を確認できます。)

6. 電圧を測定

const int VOL_PIN = A0;

void setup(){
    Serial.begin( 9600 );
}

void loop(){
    int value;
    float volt;

    value = analogRead( VOL_PIN );

    volt = value * 5.0 / 1023;

    Serial.print( "Value: " );
    Serial.print( value );
    Serial.print( "  Volt: " );
    Serial.println( volt );


    delay( 500 );
}

電圧が読み取れます。

プログラムの説明
  • 11行目のvalue = analogRead( VOL_PIN );:電圧読み取り。
  • 13行目のvolt = value * 5.0 / 1023;:0から5vに変換(関係ないですが5.0を5とすると小数点以下が四捨五入されます)
    練習
  • いろいろなピンにつないでみましょう(基本0Vか5V)

7. ライブラリ

 センサを使う際などにプログラムが複雑になる場合ライブラリを使います(Serial.print、Serial.beginなどもライブラリ)。自分で作れますがArduinoの場合GitHubなどでダウンロードできることが多いです。いきなりライブラリを作るのは難しいのでまずはネットで探してダウンロードしたものを使うといいと思います。今回は僕が作ったAD5328(DAコンバータ)のライブラリを例に説明します ライブラリ。 右上のCodeからダウンロードできます。 Auruinoのソフトのスケッチ->ライブラリをインクルード->.ZIP形式のライブラリをインストールで使えるようになります。 使用する際はまずはsampleファイルを確認しましょう。

練習
  • ファイルを見てみよう(.hファイル、.cppファイル、keywords.txt、library.prorerties)
  • センサの主な通信方式であるI2C、SPI通信について説明しよう。

Arduino学 Ⅱ ~データ通信編~ - NKMRHYTのブログ

  • いろいろなライブラリを使ってみよう
  • ローパスフィルタについて勉強しよう

ローパスフィルタで復習する制御工学 - Qiita