Arduino環境でArduino Nanoを使う

コンピュータ、組み込み

マイコン入門としてとても有名で、安価で入手性もよく手軽にマイコン制御を学ぶことができます。
Arduino Nano を使って基本的なIO制御、マイコン通信(UART, I2C, SPI)を使ってみます。

紹介するもの

Arduino Nano

特徴

安価で入手性もよい。
マイコンの基本的な制御や通信を学びやすい。

接続Mini B
ジェネリックでは Micro B や Type Cもある
CPUAVR Atmega328P 16MHz
メモリプログラマメモリ 32KByte
RAM 2KByte
EEPROM 1KByte
ロジックレベル5V
GPIO23
PWM8 (8bit 0 ~ 255) (GPIO1 ~ GPIO10)
ADC9 (10bit 0 ~ 1023, 5V)
UART1
I2C1
SPI1
その他
ピン配置
外観

400穴ブレッドボードでは、左右3列と2列使用することができます。

使ってみて

最近のマイコンと比べるとできる性能的には見劣りしますが、基本機能は同じなので学ぶためのマイコンとしては十分です。

最近のマイコンと比較したメリットとしては、ピン機能も固定なのでどのピンに機能を割り当てるかなど設計に悩むこともなく、ボードを使用するためのライブラリも環境と標準でパッケージになっているため、学びのための敷居が低く躓きが少ないものと思います。

ArduinoIDEからのコンパイルから書き込みが終了するまでの時間が速いです。
当ページのサンプルプログラムであれば10秒ほどで書き込めるので、安価なPC(Raspberry Pi3やPi4)でもそれほどストレスなく開発することができます。

デメリットして感じたことは、一部のライブラリでは書式付き出力関数にはprintf()などC言語でなじみのある関数が使用できないものもあります。

また、ロジックレベルは5Vです。
現在主流の3.3Vマイコンとの通信(マイコン同士、モジュール)がうまくできないこともあるので、各製品の電源電圧や通信のロジックレベルを確認する必要があります。

動作電圧3.3Vのモジュールに5Vを印加することで破損することがあるので、モジュールの動作電圧は必ず確認してください。

準備

ライブラリ

ボードライブラリ

ArduinoIDEをパソコンにインストールすることで標準でライブラリもインストールされます。
ボードマネージャから、[Arduino AVR Boards > Arduino Nano]を選択します。

モジュールライブラリ

機能やモジュールを使用しない場合インストールの必要はありません。

機能/モジュールライブラリ名検索確認時のバージョン
SSD1306Adafruit SSD1306 by AdafruitSSD13062.5.1
ST7735Adafruit ST7735 and ST7789
Library by Adafruit
ST77351.9.3
関連
SSD1306
ST7735
Adafruit GFX Library by AdafruitGFX1.11.3

スケッチの書き込み

メニュー > ツール > Processor > ATmega328P (Old Bootloader) を選択します。


Arduino IDEの書き込みボタンより書き込みができます。

基本スケッチ

ボタンLED

説明

タクトボタンとLEDの組み合わせの動作をします。

タクトボタンはプルダウン回路で入力します。(押下したらHIGH)

3.3V -> タクトスイッチ -> GPIO3(D3) -> プルダウン抵抗(10KΩ) -> GND
GPIO2(D2) -> 保護抵抗(200Ω) -> LED -> GND


タクトボタンを読み取り、押下されるとLEDが点灯します。
ボタンが離されるとLEDは消灯します。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Arduino Nano

【スケッチの説明】
プルダウンしたピンの状態がHighならLEDを点灯、LowならLEDを消灯させます。

【ライブラリ】
Arduino AVR Boards > Arduino Nano

【準備】
3.3V -> タクトスイッチ -> GPIO3(D3) -> プルダウン抵抗(10KΩ) -> GND
GPIO2(D2) -> 保護抵抗(200Ω) -> LED -> GND

【バージョン情報】
2023/7/11 : 新規
**********************************************************************/

#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は消灯しました。

PWM,DAC

説明

PWMを使ってLEDのフェード点灯(ゆっくり点灯させる)を行います。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Arduino Nano

【スケッチの説明】
プルダウンしたピンの状態がHighならLEDを点灯、LowならLEDを消灯させます。

【ライブラリ】
Arduino AVR Boards > Arduino Nano

【準備】
GPIO3(D3) -> 保護抵抗(200Ω) -> LED -> GND

【バージョン情報】
2023/7/11 : 新規
**********************************************************************/
//Arduino Nano PWM pin : 3, 5, 6, 9, 10, 11

#define PWM 3         //PWM 出力ピン


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

void loop()
{
  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, i);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, 256 - i);
    delay(2);
  }
}
結果

LEDがゆっくり点灯、ゆっくり消灯しました。

ADC

説明

ADCに入力された電圧を読み取りCOMに出力します。

電圧の入力にLOLIN32 Liteを使用します。
0~255(約3.3V) まで2msごとに1ずつ上昇し、255(約3.3V)~0までを2msごとに1ずつ下降する設定を繰り返します。

配線
Arduino nano配線LOLIN32 Lite
GPIO1(ADC)GPIO26(DAC)
GNDGND
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Arduino Nano

【スケッチの説明】
ADCから読み取った電圧をCOMに出力します。
電圧ジェネレータにLOLIN32-Lite使用します。

【ライブラリ】
Arduino AVR Boards > Arduino Nano

【準備】
Arduino Nano <-> LOLIN32-Lite

【バージョン情報】
2023/7/11 : 新規
**********************************************************************/

#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を固定で入力しています。

画像左で入力した0Vから3.3Vの変化をする電圧をオシロスコープで確認しました。
3.3Vまできれいに出力されています。

UART

説明

ArduinoNano にはUARTは1chあります。
USBシリアル(COM)と共通のため、ソフトウエアシリアルでCOMとソフトウエアシリアルの通信をします。

COMから読み取ったデータをSoftwareSerial(UART)に送信します。
SoftwareSerial(UART)から読み取ったデータをCOMに送信します。

配線
Arduino nano配線FT232RL
GPIO2(TX)RX
GPIO3(RX)TX
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Arduino Nano

【スケッチの説明】
COMから読み取ったデータをSoftware Serial(UART)に送信します。
Software Serial(UART)から読み取ったデータをCOMに送信します。

【ライブラリ】
Arduino AVR Boards > Arduino Nano

【準備】
Software Serial(UART)の通信には、FT232RLを使用します。
Arduino Nano <-> FT232RL
GPIO2(TX) <-> RX
GPIO3(RX) <-> TX

【バージョン情報】
2023/7/11 : 新規
**********************************************************************/
#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)

説明

I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。
Arduino Nano ではI2Cは固定の位置で使用します。
ピン配置表に従い配線します。

そのほかの図形描画サンプルは、Arduinoサンプルを参照してください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

配線
Arduino nano配線SSD1306(0.96inch)
3.3Vまたは5VVCC
GNDGND
GPIO5(SCL)SCL
GPIO4(SDA)SDA
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Arduino Nano

【スケッチの説明】
SSD1306 OLEDの制御をします。

【ライブラリ】
Arduino AVR Boards > Arduino Nano
Adafruit SSD1306 by Adafruit
Adafruit GFX Library by Adafruit

【準備】
マイコン基板 <-> SSD1306
3V3         <-> VCC
GND         <-> GND
GPIO4(SDA)  <-> SDA
GPIO5(SCL)  <-> SCL

【バージョン情報】
2023/7/11 : 新規
**********************************************************************/

#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のサンプルスケッチが動作しました。

SPI(ST7735)

説明

SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。
Teensy 4.0ではSPIを1系統使用できます。

そのほかのグラフィックのサンプルはArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest

配線
Arduino Nano配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO0CS
GPIO1RESET
GPIO2AO
GPIO10(SPI MOSI)SDA
GPIO8(SPI CLK)SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Arduino Nano

【スケッチの説明】
ST7735 LCDの表示制御します。
デフォルトピンを使用しています。

【ライブラリ】
Arduino AVR Boards > Arduino Nano
Adafruit ST7735 and ST7789 Library
Adafruit GFX Library

【準備】
マイコン基板 <-> ST7735
3V3            <-> VCC
GND            <-> GND
GPIO10(CS)     <-> CS
GPIO8          <-> Reset
GPIO9          <-> AO
GPIO11(MOSI)   <-> SDA
GPIO13(SCK)    <-> SCK

【バージョン情報】
2023/7/11 : 新規
**********************************************************************/

#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のサンプルスケッチが動作しました。

コメント

タイトルとURLをコピーしました