Arduinoをセットアップする
目次
マイコンについて
突然ですが、私達の身の回りには、マイコン(Microcontroller Unit:マイクロコントローラー・ユニット)が溢れています。
パソコンやスマートフォンは「コンピュータ」らしいのでよく判ると思いますが、ご飯を炊く炊飯器も、お風呂にお湯を張る給湯器も、エアコンもみんな「マイコン」が制御しています。
このマイコンは、与えられたプログラムに従い、センサー類から情報を得たり、内蔵時計に従ったりして一定の動作を行っています。
だから指定の時間にご飯が炊けたり(時計や温度管理)自動でお湯張りしたり(湯の温度管理、水位の管理)して、私達の暮らしを支える「縁の下の力持ち」です。
このブログの主は、プログラムを仕事にしており、また、前職は社内SEで、決してマイコンの技術者ではないのですが、マイコンの制御はプログラムを作る上での基礎的な考え方の参考になりますし、なにより「作ったモノが動くのは楽しい」ので、マイコン関係も触っています。
この記事は、そのマイコンの中でも有名な「Arduino(アルデュイーノ)」でいろいろ作っていくご紹介になります。
Arduinoとは
Arduinoはイタリアの技術者のプロジェクトから誕生した、マイコンボードです。
ボード上にもちゃんと、MADE IN ITALY と書かれています。
「もっとシンプルに、もっと安価に、技術者でない学生でもデジタルなものを作ることができるようにする」事を目的にしています。
当ブログの記事では、「シングルボードコンピュータ」として、Raspberry Piをご紹介しました。
この記事で紹介するArduinoは写真左。右はRaspberry Piです。
大きさはそれほど変わりません。特徴としては、USB機器を接続するポートはなく、LANケーブルもささりません。
本体についている銀色のボックスは、USBのType-Bで、パソコンのUSBと繋いでプログラムを書き込むのが主な目的です。
ここにUSBキーボードやマウスなどを繋げる事は想定されていません。
マイコンボードとシングルボードコンピュータの目指すものの違いが表れています。
Arduino本体のセットアップ
Arduino本体のセットアップには、USBケーブルが必要です。
USBケーブルは、プリンタ用などとして用意されているものを使用します。
これ以外は、機器を接続したり、SDカードを用意したりする必要はありません。
そのUSBケーブルをこのように接続します。
本体側のセットアップはこれで終了です。
Raspberry PiのようにOSを書き込んだり、初期設定があるわけではありませんが、電源ランプが点灯するだけでなにも起こりません。
それは、USBから給電は受けたものの、Arduinoが何も動作の指示をされていないためです。
そのため、この指示を書き込みします。
Arduino開発環境のセットアップ
Arduinoを動作させるには、動作プログラムを書き込む必要があります。
そのプログラムを作成したり、書き込みしたりするパソコン用ソフトウェアが、Arduino IDE
Arduinoの統合開発環境(Integrated Development Environment)になります。
こちらのサイトからダウンロードします。
いまは大抵、Windows10でしょうから、一番上のリンクで大丈夫です。
寄付を求められますが、寄付しなくてもJUST DOWNLOADでダウンロードできます。
余裕があるなら寄付をお願いします。
ダウンロードしたら、arduino-1.8.19-windows.exe を実行します。
右下のボタンでインストールを開始します。
オプションなどは特にデフォルトのままで問題ありません。
インストール箇所もデフォルトで問題ないでしょう。
インストールが開始されたら暫く待ちます
完了したら、CLOSEで閉じます.デスクトップにアイコンが出来ているはずです
セキュリティソフトによっては、ファイヤーウォールで弾かれる事があるので、許可をしてください。
Lチカプログラムを作成する。
Arduinoではプログラムのことを「スケッチ」といいます。
プログラムの勉強は、どれも「『 Hello World』を表示する」というものからはじめます。
電子工作での「HelloWorld」にあたるのは、LEDをチカチカと点滅させる「Lチカ」ですので、LEDを点滅させてみます。
簡単なLEDが1秒光って2秒消えるのを繰り返すスケッチだとこうなります。
const int LED = 13;
void setup() {
// 13ピンを出力に設定
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(2000);
}
Arduino IDEにプログラムの内容を書き込んだら、ボタンを押してコンパイルし、問題が発生しなかったら、隣のボタンでArduinoへ書き込みます。
Arduinoにはプログラムを実行する指示はありませんので、書き込みが完了すれば、スケッチに従って動作します。
13と書かれた部分のLEDが1秒光って2秒消えるのを繰り返しているのが判ります。
I2C機器を繋いでみる
LEDがチカチカしているだけではツマラナイので、なにか電子工作らしいことをしてみましょう。
温度センサーで室温測定
Raspberry Piでもやりましたので、I2C温度センサーを読んでみます。
ArduinoでI2C機器を接続するのは次のように配線します。
センサーのピンは左からVDD、SCL、SDA、GNDになっています。
Arduinoの5v+、A5、A4、GNDのピンボックスにケーブルで結線します。
動作させるプログラムはこちらのサイト様のを参考にさせていただきました。
#include <Wire.h>
int adt7410I2CAddress = 0x48;
// 初期化
void setup(void) {
Serial.begin(9600);
Wire.begin(); //マスタで初期化
delay(10000); //10秒待つ
}
// メインループ
void loop(void) {
uint16_t uiVal; //2バイト(16ビット)の領域
float fVal;
int iVal; //符号ありの整数の値を保持
Wire.requestFrom(adt7410I2CAddress, 2); //2バイト要求
uiVal = (uint16_t)Wire.read() << 8; // 1バイト読み出しで上位にシフト
uiVal |= Wire.read(); // 1バイト読み出して下位にセット
uiVal >>= 3; // シフトで13bit化
//uiVal = 0x1fff; //確認テスト用
if(uiVal & 0x1000) { // 13ビットで符号判定
iVal = uiVal - 0x2000; // マイナスの時 (10進数で8192)
}
else{
iVal = uiVal; //プラスの時
}
fVal = (float)iVal / 16.0; // 温度換算(摂氏)
Serial.println(fVal, 4); // シリアル送信
delay(3000); //3秒待つ
}
こちらを実行すると、このようになります。
3秒ごとに温度データが取得され、保冷剤を近づけたり、逆に指の体温で温めたりすると、温度が変化しているのが判ります。
情報を液晶ディスプレイに表示する
温度センサーは読み取れましたが、パソコンのUSBに送りつけているため、パソコンを開いていないと温度が見られません。
パソコン用のディスプレイを繋げられるRaspberry Piと違い、Arduinoに標準の画像出力機能はありませんが、I2C機器には液晶ディスプレイがあるため、文字情報を表示する事ができます。
ちなみに、I2C機器はアドレスが異なれば、複数の機器をつなぐ事ができます。
こちらは文字だけですが、8文字2行の情報を表示できます。
結線はこのようにします。
メーカーも異なるため、温度センサーとはピンの配置が違います。
左からGND、SDA、SCL、Reset、VDDです。
また動作が3.3Vなので注意が必要です。
GNDはブレッドボードのマイナスに繋ぎます。
ブレッドボードは、上の図でいうと縦に並んだ穴は全て電気的に繋がっていますので、Arduinoのピンからブレッドボードに挿した縦列からコードで分岐ができます。
SDA、SCLはそうして繋ぎます。
3.3Vの+は、Arduinoのピンから結線すればOKです。
では、まずは温度計は無視してLCDだけ使用してみましょう。
Arduino IDEには、送り込むプログラムのサンプルが用意されています。
購入した際の取り扱い説明(データシート)には、ST7032が制御ICとなっているため、これ用のサンプルプログラムを取り込みしてみます。
これでサンプルプログラムがライブラリに登録されたので、呼び出してみましょう。
ファイル からスケッチ例 を選択すると、このようにスケッチのリストが出てきます。
インストールしたST7032のスケッチがありますので、HelloWorldを選択します。
#include <ST7032_asukiaaa.h>
ST7032_asukiaaa lcd;
void setup() {
lcd.begin(16, 2); // columns and rows
lcd.setContrast(30);
// If lcd become black, try reduced value for contrast
// lcd.setContrast(10);
lcd.print("hello!");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis()/1000);
}
このようなスケッチがサンプルとして読み込まれました。
そのまま、Arduinoに書き込んで見ましょう
lcd.print(“hello!”) の指定でhello!が書かれ、その下は lcd.setCursor(0, 1) で二行目を指定し、1秒づつカウントアップしていってます。
温度センサーもADT7410でライブラリを検索すると、スケッチ例がでてくるので、この両者を混ぜ合わせ、次のようなプログラムにしました。
#include <Wire.h>
#include <ST7032_asukiaaa.h>
#include "Adafruit_ADT7410.h"
int adt7410I2CAddress = 0x48;
ST7032_asukiaaa lcd;
Adafruit_ADT7410 tempsensor = Adafruit_ADT7410();
// 初期化
void setup(void) {
lcd.begin(16, 2); // columns and rows
lcd.setContrast(30);
// If lcd become black, try reduced value for contrast
// lcd.setContrast(10);
if (!tempsensor.begin()) {
Serial.println("Couldn't find ADT7410!");
while (1);
}
lcd.setCursor(0, 0);
lcd.print("hello!");
}
// メインループ
void loop() {
delay(5000);
float c = tempsensor.readTempC();
float f = c * 9.0 / 5.0 + 32;
delay(5000); //5秒待つ
lcd.setCursor(0, 0);
lcd.print(c);
lcd.print("*C");
lcd.setCursor(0, 1);
lcd.print(f);
lcd.print("*F");
}
起動すると、5秒間「hello!」と表示した後、温度センサーから読み取った摂氏とそこから計算した華氏の温度を5秒毎に更新するスケッチになります。
温めた金属を近づけたり、保冷剤を近づけると温度が変化する様子がわかるかと思います。
Arduinoで開発した機能をマイコンに移す。
まずは、こちらの動画を見て頂きたいと思います。
Arduinoの記事のはずなのに、なにかヘンなものが出てきました(笑)
でも、上のArduinoのと同じ画面があり、同じように「hello!」と表示した後、温度センサーから読み取った摂氏とそこから計算した華氏の温度が表示され、冷たいものを近づけると温度が下がり、熱いものを近づけると上がります。
実はこれ、自作のArduinoです。
自作のArduinoに、先ほど、実物のArduinoで走らせたのと同じスケッチを書き込んだので、同じように動作しているという訳です。
なぜそんな事ができるのでしょうか?
ものすごくぶっちゃけて言うと、実はArduinoが動作するのに必要なのは、下の図の赤い枠の部分だけなのです。
これは、ATMEGA328P-PUというAVRマイコンで、電子部品を扱っているお店で買う事ができます。
ATMEGA328P-PUを動作させるには、他にクロック周波数を作る水晶発振子と22pFのセラミックコンデンサ2個、0.1μFのセラミックコンデンサ、タクトスイッチとLED、1KΩと330Ωの抵抗があればよく、上の回路図のように接続します。
例えば、秋月電子通商で買い物かごに入れてみたら、2022年5月初旬でこのリストになりました。
「え? 700円? Arduino unoって買ったら3000円超えるのに、原価が700円って、ボッタクリ?」
そんな原価厨みたいな事を言い出さないでくださいね(笑)
上の図は確かにArduinoとして動作しますが、まず電源がありません。
マイコンは電源がなければ、ただの黒いゲジゲジです(笑)動作電圧の5Vの直流をどうやってこのマイコンに安定して流すのかを考える必要があります。
例えば乾電池を繋ぐのも手ですが、1.5ボルトなので3個だと足らないし、4個だと降圧しないといけません。
また、仮に電源はなんとかなったとして、ATMEGA328P-PUをArduinoとして使用するには、Arduinoのブートローダを書き込んでやる必要があります。
この問題は、ブートローダを書き込んだATMEGA328P-PUも秋月電子で販売しているので、そちらを買うとして、どうやってこのマイコンにスケッチ、つまりプログラムを書き込むのかも考える必要があります。
こうしたROMにプログラムを書き込む「ROMライター」という機器はあり、AVRマイコンにもライターはあります。それを用意しないといけません。
一方、Arduinoは、本体を購入し、USBケーブルでパソコンと繋げば、電源もROMライターも全て揃ってしまいます。
プログラムの開発環境も提供されていますから、買ってすぐにプログラムをパソコンで開発し、USB接続で簡単にマイコンに送り込めます。
仮にプログラムミスでヘンな動作をしても、何度でも修正して試行錯誤が可能です。
電源はパソコンから供給されますし、なんなら青枠で囲った部分に12VのACアダプタを接続すれば、パソコンから離しても安定した電力をマイコンに供給できます。
納得がいくまで、動作や機能をArduinoで試験し、スケッチを修正しては書き込みして試し、目的の機能を果たす事がわかったら、ATMEGA328P-PUにスケッチを移し、電源を与えれば、世界に一つだけの電子機器を作る事ができます。
ATMEGA328P-PUにブートローダーを書き込む
今回の場合、ATMEGA328P-PUは生の状態ですので、ブートローダーを書き込む必要があります。
書き込みについては、以前にKashiwaGeeksさん主催のIoTもくもく会で作った事がありますが、ネット内の記事としては、
こちら様の記事が大変参考になりました。
まず、手持ちのArduinoを、書き込み機にするため、ArduinoIDEを開きます。
ちなみに、Arduinoにスケッチは上書きされますので、スケッチの保存はご注意ください。
ファイル>スケッチ例からArduinoISPを選択します
ツール>ボートで選択します。今回はArduino unoです。
書き込み装置をArduino as ISPにします。asの無いArduinoISPと間違えないように!
次に書き込むATMEGA328P-PUをブレッドボードに挿し、抵抗、水晶発振子、コンデンサなどを配線します。
配線がキレイではないですが、このように結線します。
これで、ツールのブートローダを書き込むで書き込みが完了します。
これで、このATMEGA328P-PUは、スケッチの書き込まれていないArduinoになりました。
Arduinoとして、スケッチを書き込んでみる
方法としては、ArduinoのATMEGA328P-PUを抜き、今書き込んだATMEGA328P-PUと交換する方法もありますが、事のついでにUSB接続まで可能な自作Arduinoにしてしまいましょう。
こちら様の記事を参考に、USB接続と、電源も用意します。
USBシリアル変換モジュールキットを配置し、ワイヤーを引き回しします。
DCDCコンバータキットは二種類を用意し、ブレッドボードの片方を5V、片方を3.3Vとしました。
電源は、12VのACアダプタから供給。コンバーターキットで夫々に分けています。
実際に組むと、このようになります。
さらに発展させる
Arduinoはいろいろな事ができます。
センサー、モーター制御、無線通信などを組み込んでいけば、さまざまな動作を行う事ができます。
ぜひ、世界でひとつだけの自分の機器をつくってみましょう!