マイコン入門として有名で、安価で入手性もよく手軽にマイコン制御を学ぶことができます。
Arduino Nano を使って基本的なIO制御、マイコン通信(UART, I2C, SPI)を使ってみます。
Arduino Nano
マイコン基板に必要な基本機能が搭載されています。
ライブラリも安定していて、多くのモジュールライブラリも対応している。
情報も多くマイコンやArduinoを始めるのに最適な基板。
主なスペック
安価で入手性もよい。
マイコンの基本的な制御や通信を学びやすい。
接続 | Mini B ジェネリックでは Micro B や Type Cもある |
CPU | AVR Atmega328P 16MHz |
メモリ | プログラマメモリ 32KByte RAM 2KByte EEPROM 1KByte |
ロジックレベル | 5V |
GPIO | I/O 23 PWM 6 (8bit 0 ~ 255) (GPIO1 ~ GPIO10) ADC 8 (10bit 0 ~ 1023, 5V) |
通信 | UART 1 I2C 1 SPI 1 |
入手 | 国内ショッピングサイト ネットストア 実店舗 Ali Express |
参考価格 | 国内 \700~\800 Ali Express ¥500~\600 |
参考価格:変動することがあります。保証価格ではありません。単品、送料税込み価格です。
ピン配置
![](https://tamanegi-digick.com/wp-content/uploads/2023/07/AVRnano-pin.jpg)
外観
![](https://tamanegi-digick.com/wp-content/uploads/2023/07/ARDNANO-top.jpg)
![](https://tamanegi-digick.com/wp-content/uploads/2023/06/ARDNANO-back.jpg)
400穴ブレッドボードでは、左右3列と2列使用することができます。
使ってみて
Good
ArduinoIDEをインストールするだけで開発ができる簡便さ。
設計がシンプルで学習での躓きが少ない。
小ぶりな基板でブレッドボードの面積を有効に使用できる。
多くのモジュールライブラリが対応しているので開発が進めやすい。
Bad
モジュールやマイコンのロジックレベルが3.3Vが主流になったため、信号にはロジックレベル変換が必要になってきた。
最近のマイコンと比べると設計や古さやライブラリの使い勝手での劣勢が見られる。
そのほか
最近のマイコンと比べると数値的なスペックに見劣りしますが、学びをするには優秀な基板です。
Badにも記載した設計の古さやライブラリ面では、新しいマイコン基板には使える関数や定義などが使えないことがありますが、逆に言えば基本に忠実で熟成したライブラリにより新しく発生する不具合やトラブルなく開発がすすめられます。
習熟中に発生するトラブルは、自分のスケッチの不具合や配線間違いかライブラリの不具合かを切り分けるのが困難です。
またArduinoIDEからのコンパイルから書き込みが終了するまでの時間が速いです。
当ページのサンプルプログラムであれば10秒ほどで書き込めるので、低スペックなPC(Raspberry Pi3やPi4)でもそれほどストレスなく開発することができます。
準備
ライブラリのインストール
ボードライブラリ
Arduino Nanoに必要なボードライブラリは、ArduinoIDEに同梱されてインストールされます。
使用するライブラリバージョンを限定する場合は、ボードライブラリマネージャから変更できます。
追加のボードマネージャのURL | 不要 |
検索 | arduino |
ボードライブラリ | Arduino AVR Boards by Arduino |
選択するボード | Arduino AVR Boards > Arduino Nano |
ボードマネージャから、[Arduino AVR Boards > Arduino Nano]を選択します。
![](http://tamanegi.digick.jp/wp-content/uploads/2023/07/nano_boardlibrary-1024x389.png)
モジュールライブラリ
サンプルスケッチでは、OLED SSD1306モジュールと、LCD ST7735モジュールを使用します。
モジュールを使用しない場合インストールの必要はありません。
機能/モジュール | ライブラリ名 | 検索 | 確認時のバージョン |
---|---|---|---|
SSD1306 | Adafruit SSD1306 by Adafruit | SSD1306 | 2.5.1 |
ST7735 | Adafruit ST7735 and ST7789 Library by Adafruit | ST7735 | 1.9.3 |
関連 SSD1306 ST7735 | Adafruit GFX Library by Adafruit | GFX | 1.11.3 |
スケッチの書き込み
メニュー > ツール > Processor > ATmega328P (Old Bootloader) を選択します。
![](http://tamanegi.digick.jp/wp-content/uploads/2023/07/nano_parameter.png)
Arduino IDEの書き込みボタンより書き込みができます。
基本スケッチ
ボタンLED
説明
タクトボタンとLEDの組み合わせの動作をします。
タクトボタンはプルダウン回路で入力します。(押下したらHIGH)
タクトボタンを読み取り、押されている間はLEDを点灯します。
ボタンが離されるとLEDは消灯します。
配線
![](https://tamanegi-digick.com/wp-content/uploads/2024/03/ardnano-buttonled-wiring.png)
スケッチ
#define LED 2 //LED
#define BUTTON 3 //タクトスイッチ
void setup()
{
pinMode(LED, OUTPUT); //ピン出力設定
pinMode(BUTTON, INPUT); //入力設定
}
void loop()
{
int iStat = digitalRead(BUTTON);
digitalWrite(LED, iStat); //ボタンの状態をLEDに出力
}
結果
ボタンが押されるとLEDは点灯しました。
ボタンが離されるとLEDは消灯しました。
![](https://tamanegi-digick.com/wp-content/uploads/2023/07/AVRnano-buttonLED-result.jpg)
PWM
説明
PWMを使ってLEDのフェード点灯(ゆっくり点灯させる)を行います。
マクロ定義 INTERVALの値を変更することで点灯と消灯の速度を変えることができます。
小さくすると速く、大きくすると遅くなります。
配線
![](https://tamanegi-digick.com/wp-content/uploads/2024/03/avrnano-led-wiring.png)
スケッチ
#define PIN_PWM (3) //PWM 出力ピン
#define INTERVAL (2)
void setup()
{
pinMode(PIN_PWM, OUTPUT);
}
void loop()
{
for(int i = 0; i < 256; i ++)
{
analogWrite(PIN_PWM, i);
delay(INTERVAL);
}
for(int i = 0; i < 256; i ++)
{
analogWrite(PIN_PWM, 256 - i);
delay(INTERVAL);
}
}
結果
LEDがゆっくり点灯、ゆっくり消灯しました。
ADC
説明
ADCに入力された電圧を読み取りCOMに出力します。
電圧の入力にESP32-WROOMを使用します。
0~3.3V を約500msかけて上昇し、0に500msかけて下降する動作を繰り返します。
配線
![](https://tamanegi-digick.com/wp-content/uploads/2024/03/avrnano-adc-wiring.jpg)
スケッチ
#define PIN_ADC (14)
void setup()
{
Serial.begin(115200);
pinMode(PIN_ADC, INPUT);
}
void loop()
{
char buf[128];
int iADC = 0;
//外部から入力された電圧を読み取り、結果をCOMに出力します。
iADC = analogRead(ADC);
sprintf(buf, "(ADC) = %d", iADC);
Serial.println(buf);
delay(2);
}
結果
入力した電圧を読み取った結果をグラフにしました。
電圧の変化は0V -> 3.3Vまでを約500msで上昇し、3.3V -> 0Vまで約500msで下降します。
Arduino Nanoのアナログ電圧入力は5Vです。
結果はひどいノイズが混ざっていますが、読み取りが可能な範囲です。
5Vは1024(AD)で3.3Vなら600強(AD)なので、おおむね合っているようです。
精度のある読み取りは難しいですが、電圧が高めとか低めぐらいの判定はできそうです。
画像左は0Vから3Vまでの変化、画像右は3.3Vを固定で入力しています。
![](http://tamanegi.digick.jp/wp-content/uploads/2023/07/AVRnano-ADC-result.png)
画像左で入力した0Vから3.3Vの変化をする電圧をオシロスコープで確認しました。
3.3Vまできれいに出力されています。
![](https://tamanegi-digick.com/wp-content/uploads/2022/11/DAC-reference.png)
UART
説明
Arduino Nano にはUARTが1chあります。
USBシリアル(COM)と共通のため、ソフトウエアシリアルでCOMとソフトウエアシリアルの通信をします。
COMから読み取ったデータをSoftwareSerial(UART)に送信します。
SoftwareSerial(UART)から読み取ったデータをCOMに送信します。
配線
Arduino nano | 配線 | FT232RL |
---|---|---|
GPIO2(TX) | 黄 | RX |
GPIO3(RX) | 緑 | TX |
スケッチ
#include <SoftwareSerial.h>
#define PIN_TX 2
#define PIN_RX 3
SoftwareSerial SWSerial(PIN_RX, PIN_TX);
void setup()
{
Serial.begin(115200);
SWSerial.begin(115200);
}
void loop()
{
if(Serial.available() != 0) //SoftwareSerial(UART)にデータがあれば、読み取った内容をCOMに送信
{
SWSerial.write(Serial.read());
}
if(SWSerial.available() != 0) //COMにデータがあれば、読み取った内容をSoftwareSerial(UART)に送信
{
Serial.write(SWSerial.read());
}
}
結果
結果はTeratermを2つ起動して確認します。
1つはCOM用で、もう一つはSoftwareSerial(UART)FT232RL用です。
結果は省略します。
COM用のTeratermに入力された文字は、SoftwareSerial用のTeraterm画面に表示されます。
SoftwareSerial用のTeratermに入力された文字は、COM用のTeraterm画面に表示されます。
I2C(SSD1306)
説明
このサンプルは以下モジュールライブラリのインストールが必要です。
・Adafruit SSD1306 by Adafruit
・Adafruit GFX Library by Adafruit
I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。
Arduino nanoで使用できるSPIは1chで信号線のピンは変更できません。
そのほかの図形描画サンプルは、Arduinoサンプルを参照してください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c
配線
![](https://tamanegi-digick.com/wp-content/uploads/2024/03/avrnano-ssd1306-wiring.png)
スケッチ
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64 //SCREEN_HEIGHTは 32 に設定することができます。
#define OLED_RESET -1 //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C //I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//表示制御にはAdafruit製 SSD1306を使用する。
void setup()
{
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
for(;;);
}
display.clearDisplay(); //何か表示されている場合に備えて表示クリア
display.setTextSize(2); //フォントサイズは2(番目に小さい)
display.setTextColor(SSD1306_WHITE); //色指定はできないが必要
display.setCursor(20, 0); //テキストの表示開始位置
display.print(F("TAMANEGI")); //表示文字列
display.setCursor(15, 25);
display.print(F("OLED 0.96"));
display.setCursor(25, 45);
display.print(F("SSD1306"));
display.display(); //バッファ転送(表示)
}
void loop()
{
}
結果
SSD1306のサンプルスケッチが動作しました。
![](http://tamanegi.digick.jp/wp-content/uploads/2023/01/I2C-SSD1306-result.jpg)
SPI(ST7735)
説明
SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。
Arduino nanoで使用できるSPIは1chで信号線のピンは変更できません。
そのほかのグラフィックのサンプルはArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest
配線
![](https://tamanegi-digick.com/wp-content/uploads/2024/03/avrnano-st7735-wiring-1024x366.jpg)
スケッチ
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
//S/W SPIはこちら。遅いが任意のピンを使用できる。
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST);
void setup(void)
{
tft.initR(INITR_BLACKTAB); //Init ST7735S初期化
tft.fillScreen(ST77XX_BLACK); //背景の塗りつぶし
//テキスト表示
tft.setRotation(3); //画面回転
tft.setTextSize(3); //サイズ
tft.setCursor(0, 10); //カーソル位置
tft.setTextColor(ST77XX_GREEN); //緑
tft.print("TAMANEGI\n");
tft.setCursor(0, 50); //カーソル位置
tft.setTextSize(2); //サイズ
tft.setTextColor(ST77XX_RED); //赤
tft.print("1.8inch LCD\n");
tft.setTextColor(ST77XX_YELLOW); //黄
tft.print("Res=128 x 160\n");
tft.setTextColor(ST77XX_BLUE); //青
tft.print("ST7735\n");
}
void loop()
{
}
結果
ST7735のサンプルスケッチが動作しました。
![](http://tamanegi.digick.jp/wp-content/uploads/2023/01/SPI-ST7735-result.jpg)
コメント