【Arduino】Super Mini Nano 328Pを使う

it

Super Mini Nano 328Pを使ってみました。
Atmega328Pを搭載した小型基板を使って、GPIO、通信機能を使ってみます。

記事の概要

Super Mini Nano 328Pについて簡単な紹介をしています。
この基板を使って実際に開発して感じた内容をまとめました。
開発環境の作り方と、作って動かした回路とモジュール、スケッチを掲載しています。

Super Mini Nano 328P

簡単紹介

小型で安価な開発基板です。
デジタル入出力、PWM、ADC、UART、I2C、SPIなどマイコンで使いたい機能が一通り搭載されています。

◆入手

Ali Expressで\450(本体) + \610(送料)

ピン配置

外観

使ってみた

◆シリーズ比較

Ali Expressで購入しました。
Super Miniと名前の付いた小型の基板にATMega 328Pの搭載基板を見つけました。

電源関係のピン位置は同じですが、機能ピンや通信関係の位置に統一性がありません。
ピン数も違いSuper Mini と名前がついていますが、ピン配置の互換性はないのでユニバーサル基板での配置や配線作業は基板ごとの個別対応が必要です。


Super Miniとは書いていませんが、Super Miniで検索すると同じように出てくるAtmega328P搭載のよく似た基板もあります。
若干大きな基板で、知っていないと間違えそうなくらいです。
性能は同じですが、ブレッドボードで使用すると2.54mmピッチにハマりません。
電源以外のピン配置も違うようです。

画像左がSuper Mini Nano 328P。右もSuper Mini Nano 328Pのようです。

◆ピンヘッダ取り付け

この基板はGPIOの番号が順番に並んでいます。
Arduino Nano や Arduino Uno などピン番号の並びが複雑な中わかりやすい並びですが、SPI端子が基板の後方についています。
ブレッドボードで使用するには、基板の上方にピンヘッダを取り付けるか、ピンソケットを取り付ける必要があります。

今回外観で紹介したようにピンソケットを取り付けてSPI信号を使用しました。

◆開発

Arduino環境で開発をします。
Atmega328PなのでArduinoIDEをインストールすると初めからボードライブラリが使えます。
Arduino環境で開発できるマイコン基板では使うまでの準備が最短です。
また他のマイコン基板に比べてコンパイルの時間が圧倒的に短い点もあります。

最近のマイコン事情からするとAtmega系はパワー不足、容量不足の感はあります。
デジタル入力ではプルダウン/プルアップ設定がなく、抵抗を使用した回路を作成する必要があります。

通信はUART、I2C、SPIを使いました。
ピン位置は固定で変更できませんが、すべて使用できました。

◆使った感想

小型化されたAtmega328P搭載基板ですが、メリットもありますがデメリットもあります。

メリットとしてはコンパイル時間が短く、設定する項目も少ないので電子工作やプログラムを覚えるのに適していると感じます。
今回使った基板は小型でブレッドボードの占有面積も小さいので尚使いやすいと思います。

ピン配置はGPIO番号が「並び」になっているので理解のしやすさがありますが、SPIが基板後方のスルーホールになることで一工夫が必要になる点が残念です。

デメリットとしてはこの基板の設計上のトラブルが多いことです。
ユーザLEDとWS2812、SPIのSCKはすべてGPIB13です。
WS2812かSPIを使うとユーザLEDが点滅します。
また、SPIとWS2812は同時に使えませんでした。

準備

Arduino環境の作成

◆開発環境

Arduino環境の準備はこちらの記事で紹介しています。

◆ボードライブラリ

Arduino IDEをインストールすることで初めからボードライブラリが使えます。
専用の選択するボードがないので、「Arduino Nano」を使いました。

追加のボードマネージャのURL
検索atmega
ボードライブラリArduino AVR Boards by Arduino
選択するボードArduino AVR Boards > Arduino Nano
※動作確認はバージョン 1.8.6です

◆モジュールライブラリ

I2CのサンプルではSSD1306 OLED、SPIのサンプルではILI9341を使用します。
サンプルを使用しない場合はインストール不要です。

SSD1306

OLED(SSD1306)を使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit SSD1306 by AdafruitSSD13062.5.11
Adafruit GFX Library by AdafruitGFX1.11.10

ILI9341

LCD(ILI9341)を使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit ILI9341 by AdafruitILI93411.6.1
Adafruit GFX Library by AdafruitGFX1.11.10

WS2812B

WS2812Bを使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit ILI9341 by Adafruitnexpixel1.12.3

コンパイルと書き込み

ArduinoIDEのコンパイル、書き込みボタンを押すことで書き込みができます。

トラブル

WS2812とSPIが同時に使えない

◆症状

WS2812とSPI(LCDなどモニタ類)を同時に使用しようとするとWS2812が使用できない。

◆対処

対処方法は見つかっていません。
WS2812で使用するDINとSPIのSCKはどちらもGPIB13が使用されています。
順番など工夫してみましたが、同時に使うことができませんでした。

スケッチ

GPIOデジタル入出力

説明

デジタル入力とデジタル出力を使います。
デジタル入力ではタクトボタンのOff/Onの状態を読み取り、デジタル出力ではLEDの消灯/点灯をします。
ボタンの押されている状態を読み取り、ボタンが押されていればLEDを点灯、ボタンが放されていればLEDを消灯します。

配線
Atmega328pではボタンのOff/Onの状態を読み取るためにプルアップ/プルダウン回路を作ります。
今回はプルダウン回路で作成しています。

LEDの保護抵抗には200Ωを使いましたが、使用するLEDにより適切なものを使用します。

スケッチ

#define LED_PIN       (2)
#define BUTTON_PIN    (3)

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

void loop()
{
  int iStat = digitalRead(BUTTON_PIN);
  digitalWrite(LED_PIN, iStat);
}

結果

ボタンを押すことでLEDが点灯し、ボタンを離すことで消灯しました。

PWM出力

説明

PWMを使いLEDのゆっくり点灯とゆっくり消灯をします。

Atmega328pのPWMは8bitで256階調(0~255)で設定できます。
最小値から最大値まで約1.3秒かけて変化し、最大値から最小値まで約1.3秒かけて変化します。

配線

スケッチ

#define LED_PIN       (3)

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

  while(1)
  {
    for(int16_t i = 0; i < 256; i ++)
    {
      analogWrite(LED_PIN, i);
      delay(5);
    }

    for(int16_t i = 0; i < 256; i ++)
    {
      analogWrite(LED_PIN, (255 - i));
      delay(5);
    }

  }
}

void loop()
{
}

結果

LEDがゆっくり点灯し、ゆっくり消灯しました。
オシロスコープ(HDS272)でPWM信号を一緒にモニタしています。
Highの時間が長くなるとLEDは明るくなり、Highの時間が短くなるとLEDは暗くなる様子がわかります。

アナログ入力(ADC)

説明

アナログ入力の読み取り(ADC)を使います。

アナログ電圧の生成にはESP32の開発基板 LOLIN32 Liteを使います。
電圧は0V -> 3.3Vまでを約500msで上昇し、3.3V -> 0Vまで約500msで下降します。

Supe Mini Nano 328PのAtmega328pのADCは0 ~ 5Vの測定をできますが、アナログ電圧の生成は3.3Vまでなので、できる範囲でサンプリングします。
読み取った値はシリアル出力します。

配線

スケッチ

#define ADC_PIN   (14)

void setup()
{
  Serial.begin(115200);

  pinMode(ADC_PIN, INPUT);
}

void loop()
{
  char buf[128];
  int iADC = 0;

  iADC = analogRead(ADC_PIN);
  sprintf(buf, "(ADC) = %d", iADC);
  Serial.println(buf);
  delay(2);
}

結果

アナログ電圧を読み取った値をシリアルに出力しました。
結果をグラフにするとリニアな増加と現象が確認できます。

今回の入力電圧の最大は3.3Vです。
5Vの読み取りが1023(AD)とすると、今回の読み取りの最大値が700(AD)強の場合約3.5V。
若干高めのオフセット気味ですが、読み取り値はきれいです。

UART

説明

UARTを使います。
パソコンからUARTシリアル変換モジュールを経由して入力した文字の大文字と小文字を入れ替えてパソコンに戻します。

大文字の’A’と入力すると’a’が戻り、小文字の’a’と入力すると’A’が戻ります。

Super Mini nano 328PはUSBコネクタからのシリアル通信ができますが、UARTのTX(GPIO0)とRX(GPIO1)と同じ信号が出ています。
今回のスケッチは、配線をすることなくUSBケーブルの接続だけでも同じ結果を得ることができますが、UARTをGPIOピンからの通信で行うため配線をして動作確認をします。

今回GPIOピンを使用するため、スケッチの書き込み後はUSBコネクタを外して、UARTシリアル変換モジュールから5Vを供給して動作させます。

Super Mini nano 328Pのロジックレベルは5Vでシリアル変換モジュールは3.3Vで通信します。
ロジックレベルを合わすために、双方向ロジックレベル変換モジュールを使います。

配線

スケッチ

#include <stdio.h>
#include <ctype.h>

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

void loop()
{
  if(Serial.available())
  {
    char c = Serial.read();
    if(isascii(c))
    {
      if(islower(c))
      {
        c = toupper(c);
      }
      else if(isupper(c))
      {
        c = tolower(c);
      }
      Serial.write(c);
    }
  }
}

結果

結果はTeratermを起動します。
ローカルエコーはONです。

画像左はUSBケーブルを使ったCOM通信です。
大文字で”TAMANEGI”と入力すると、一文字ごとに小文字に変換されています。

画像右はUSBシリアル変換モジュールとロジックレベル変換モジュールを使っています。
小文字で”abcdefg”と入力すると、一文字ごとに大文字に変換されています。

I2C(SSD1306)

説明

I2Cを使いSSD1306(OLED)の表示制御をします。

Super Mini Nano 328PのAtmega328PではI2Cのピン位置を変更できません。
電源は5Vのみ使えるのでSSD1306には5Vを供給します。

OLED画面には
“TAMANEGI”
“Super Mini”
“nano 382P”
と表示します。

配線

不要

スケッチ

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH        (128)
#define SCREEN_HEIGHT       (64)

#define OLED_RESET          (-1)
#define SCREEN_ADDRESS      (0x3C)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        
void setup()
{  

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();
  
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(20, 0);
  display.print(F("TAMANEGI"));
  display.setCursor(8, 25);
  display.print(F("Super Mini"));
  display.setCursor(15, 45);
  display.print(F("nano 328P"));
  display.display();
}

void loop()
{
}

結果

OLEDの表示ができました。

SPI(ILI9341)

説明

SPIを使いILI9341(LCD)の表示制御をします。

Super Mini Nano 328PのAtmega328PではSPIのピン位置を変更できません。
SPIの端子は基板後方のスルーホールに出ています。
ブレッドボードで使う場合、子のスルーホールにはピンヘッダを上面に取り付けるか、今回の紹介のようなピンソケットを取り付けて使用します。

電源は5Vのみ使えるのでILI9341に5Vを供給します。

LCD画面には
“SuperMini Nano 328P”
“TAMANEGI”
“2.4inch LCD”
“Res=320 x 240”
“ILI9341”
色とフォントサイズを変えながら表示します。

配線

スケッチ

#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <SPI.h>

#define TFT_CS          (2)
#define TFT_RST         (3)
#define TFT_DC          (4)

Adafruit_ILI9341 tft = Adafruit_ILI9341(&SPI, TFT_DC, TFT_CS, TFT_RST);

void setup(void) 
{
  tft.begin();
  
  tft.fillScreen(ILI9341_BLACK);
  
  tft.setRotation(3);
  
  tft.setCursor(0, 10);
  tft.setTextSize(2);
  tft.setTextColor(ILI9341_WHITE);
  tft.print("SuperMini Nano 328P\n");

  tft.setTextSize(4);
  tft.setTextColor(ILI9341_GREEN);
  tft.print("TAMANEGI\n");

  tft.setTextSize(3);
  tft.setTextColor(ILI9341_RED);
  tft.print("2.4inch LCD\n");
  tft.setTextColor(ILI9341_YELLOW);
  tft.print("Res=320 x 240\n");
  tft.setTextColor(ILI9341_BLUE);
  tft.print("ILI9341\n");
}

void loop()
{
}

結果

LCDの表示ができました。

WS2812B

説明

基板実装のWS2812Bを点灯させます。
SuperMini Nano328Pには3個のWS2812B LEDが実装されています。

各LEDには赤、緑、青を点灯させます。

配線

不要

スケッチ

#include <Adafruit_NeoPixel.h>

#define DIN_PIN     (13)
#define LED_COUNT   (3)
#define BRIGHTNESS  (128)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  pixels.begin();
  pixels.clear();
  
  //pixels.Color(Red, Green, Blue)で、パレット情報を作成する。
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, 0));
  pixels.setPixelColor(1, pixels.Color(0,BRIGHTNESS, 0));
  pixels.setPixelColor(2, pixels.Color(0, 0,BRIGHTNESS));
  pixels.show();
}

void loop()
{
}

結果

LEDが点灯しました。
WS2812は右から0番, 1番, 2番の順に連結しています。

コメント

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