このページの目次
はじめに
Arduino UNOの形状とコネクタ配置に準拠し、稼働電圧を3.3Vに設定し、最近のセンサーやディスプレイを電圧変換回路を追加することなく直接接続できるTRYGEAR-AVRでのArduinoプログラミングを紹介します。

端子の機能表
| 端子番号 | デジタル端子名 | アナログ端子名 | 機能名 | 機能 | 補足 |
|---|---|---|---|---|---|
| 0 | D0 | - | RX | ||
| 1 | D1 | - | TX | ||
| 2 | D2 | - | SW1 | タクトスイッチ1 | プルアップなし |
| 3 | D3 | - | SW2 | タクトスイッチ2 | PWM, プルアップなし |
| 4 | D4 | - | SW3 | タクトスイッチ3 | プルアップなし |
| 5 | D5 | - | LED2, SRV1, DAC | PWM, LEDでプルダウン | |
| 6 | D6 | - | LED3, SRV2, RGB | PWM, LEDでプルダウン | |
| 7 | D7 | - | |||
| 8 | D8 | - | |||
| 9 | D9 | - | PWM | ||
| 10 | D10 | - | TFT_CS | SPI/CS | |
| 11 | D11 | - | TFT_MOSI | SPI/MOSI | PWM |
| 12 | D12 | - | TFT_MISO | SPI/MISO | |
| 13 | D13 | - | TFT_SCK, LED1 | SPI/SCK | |
| 14 | D14 | A0 | |||
| 15 | D15 | A1 | |||
| 16 | D16 | A2 | SPK | 圧電スピーカー | |
| 17 | D17 | A3 | TFT_DC | ||
| 18 | D18 | A4 | I2C/SDA | SDA | |
| 19 | D19 | A5 | I2C/SCL | SCL | |
| - | - | A6 | |||
| - | - | A7 |
端子名の定義
// TRYGEAR-AVR
#define SW1 2
#define SW2 3
#define SW3 4
#define SRV1 5
#define LED2 5
#define DAC 5
#define SRV2 6
#define LED3 6
#define RGB 6
#define LED1 13
#define SPK 16
#define TFT_DC 17
#define TFT_CS 10
#define TFT_MOSI 11
#define TFT_MISO 12
#define TFT_SCK 13スイッチとLED
SW1,SW2,SW3を押すと、それぞれ対応するLEDが点灯するスケッチ例です。
#define SW1 2
#define SW2 3
#define SW3 4
#define LED1 13
#define LED2 5
#define LED3 6
void setup() {
pinMode(SW1, INPUT_PULLUP) ;
pinMode(SW2, INPUT_PULLUP) ;
pinMode(SW3, INPUT_PULLUP) ;
pinMode(LED1, OUTPUT) ;
pinMode(LED2, OUTPUT) ;
pinMode(LED3, OUTPUT) ;
}
void loop() {
int hz = 0 ;
if (digitalRead(SW1) == LOW)
digitalWrite(LED1, HIGH) ;
else
digitalWrite(LED1, LOW) ;
if (digitalRead(SW2) == LOW)
digitalWrite(LED2, HIGH) ;
else
digitalWrite(LED2, LOW) ;
if (digitalRead(SW3) == LOW)
digitalWrite(LED3, HIGH) ;
else
digitalWrite(LED3, LOW) ;
delay(100) ;
}スイッチと圧電スピーカー
SW1,SW2,SW3を押すと、それぞれ異なる音を鳴らすスケッチ例です。
#define SW1 2
#define SW2 3
#define SW3 4
#define SPK 9
void setup() {
pinMode(SW1, INPUT_PULLUP) ;
pinMode(SW2, INPUT_PULLUP) ;
pinMode(SW3, INPUT_PULLUP) ;
}
void loop() {
int hz = 0 ;
if (digitalRead(SW1) == LOW)
hz += 220 ;
if (digitalRead(SW2) == LOW)
hz += 440 ;
if (digitalRead(SW3) == LOW)
hz += 880 ;
if (hz != 0)
tone(SPK, hz) ;
else
noTone(SPK) ;
delay(100) ;
}OLEDディスプレイへの文字表示
OLEDディスプレイに文字列を表示するスケッチ例を示します。
SENSOR-PLUS のOLEDディスプレイには、コントローラとしてSSD1306が使用されています。OLEDディスプレイの制御ライブラリは、様々なものが提供されていますが、ここではU8g2ライブラリを使用した例を示します。
U8g2 ライブラリの使用法は、以下のWEBページに紹介されています。
ライブラリマネージャを使用してU8g2ライブラリを導入して使用してください。
#include <U8x8lib.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);
void setup() {
u8x8.begin();
u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
u8x8.clearDisplay();
}
char tstr[20];
void loop() {
u8x8.drawString(1, 0, "- TRYGEAR-AVR -");
u8x8.drawString(4, 1, "MicroFan");
u8x8.drawString(0, 2, "OLED Display");
u8x8.drawString(0, 3, "Piezo Speaker");
u8x8.drawString(0, 4, "Brightness SNSR");
u8x8.drawString(0, 5, "Temp. Hum. SNSR");
u8x8.drawString(0, 6, "Accelerometer");
u8x8.drawString(0, 7, "WS2812 RGB LED");
delay(1000);
}WS2812カラーLED
WS2812はNeoPixelライブラリで操作できます。
NeoPixelライブラリがインストールされると、メニューバーの[ファイル] -> [スケッチ例...]を選択すると、メニューの下の方の[カスタムライブラリのスケッチ例]の中にインストールされたNeoPixelライブラリに関する項目が追加されていることがわかります。
その項目を選択すると、いくつかのデモスケッチが表示されます。
カラーLEDの動作テストとしては、カラーLEDの鮮やかな色の変化を楽しめるstrandtestがよいでしょう。スケッチを開いたら、図に示す様に2つの定数をSENSOR-PULSの接続に合わせて設定します。
strandtestをコンパイル・実行させると、SENSOR-PLUSの右側の3個のカラーLEDが、様々に色を変えながら点滅します。気温・湿度・明るさセンサー
OLEDディスプレイに気温・湿度センサーAHT21で得られた気温と湿度と、明るさセンサー(フォトトランジスタ)で得られた明るさを表示するスケッチ例を示します。
SENSOR-PLUSの気温・湿度センサーには、AHT21が使用されています。AHT21の制御には、AHT20用のライブラリを使用することができます。ここでは、Adafruit AHTX0ライブラリを使用した例を示します。ライブラリマネージャを使用してAdafruit AHTX0ライブラリを導入して使用してください。
#include <U8x8lib.h>
#include <Adafruit_AHTX0.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);
Adafruit_AHTX0 aht;
void setup() {
u8x8.begin();
u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
u8x8.clearDisplay();
aht.begin(); // AHT21の初期化
}
char tstr[20];
void loop() {
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp); // AHT21から湿度と温度の取得
u8x8.draw1x2String(0, 0, "TEMP: ");
dtostrf(temp.temperature, 4, 1, tstr); // sprintf は実数の変換ができない
u8x8.draw1x2String(6, 0, tstr);
u8x8.draw1x2String(10, 0, "'C");
sprintf(tstr, "%2d%%", (int)humidity.relative_humidity);
u8x8.draw1x2String(0, 2, "HUM: ");
u8x8.draw1x2String(5, 2, tstr);
u8x8.draw1x2String(0, 4, "BRT: ") ;
dtostrf(analogRead(2)/4095.0, 4, 2, tstr); // sprintf は実数の変換ができない
u8x8.draw1x2String(5, 4, tstr);
delay(1000);
}加速度センサー
OLEDディスプレイに3軸の加速度と、基板の傾きを表示するスケッチ例を示します。
SENSOR-PLUSの加速度センサーには、XKTJ3-1057が使用されています。ここでは、XKTJ3-1057ライブラリを使用した例を示します。ライブラリマネージャを使用してXKTJ3-1057ライブラリを導入して使用してください。
#include <U8x8lib.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);
// Accelerometer provides different Power modes by changing output bit resolution
#define LOW_POWER
//#define HIGH_RESOLUTION
#include <kxtj3-1057.h>
#include <Wire.h>
#include <math.h>
float sampleRate = 6.25; // HZ - Samples per second - 0.781, 1.563, 3.125, 6.25, 12.5, 25, 50, 100, 200, 400, 800, 1600Hz
uint8_t accelRange = 2; // Accelerometer range = 2, 4, 8, 16g
KXTJ3 myIMU(0x0E); // Address can be 0x0E or 0x0F
void setup() {
u8x8.begin();
u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
u8x8.clearDisplay();
pinMode(21, OUTPUT) ; // 圧電スピーカーのノイズ止め
myIMU.begin(sampleRate, accelRange);
// Detection threshold, movement duration and polarity
myIMU.intConf(123, 1, 10, HIGH);
}
char tstr[20];
void loop() {
float x, y, t ;
myIMU.standby(false);
u8x8.draw1x2String(0, 0, "X: ");
dtostrf(x = myIMU.axisAccel(X), 6, 3, tstr); // sprintf は実数の変換ができない
u8x8.draw1x2String(3, 0, tstr);
u8x8.draw1x2String(0, 2, "Y: ");
dtostrf(y = myIMU.axisAccel(Y), 6, 3, tstr);
u8x8.draw1x2String(3, 2, tstr);
u8x8.draw1x2String(0, 4, "Z: ");
dtostrf(myIMU.axisAccel(Z), 6, 3, tstr);
u8x8.draw1x2String(3, 4, tstr);
t = atan2(-y, x) * 180 / 3.14 ;
u8x8.draw1x2String(0, 6, "DEG: ");
dtostrf(t, 6, 1, tstr);
u8x8.draw1x2String(5, 6, tstr);
myIMU.standby(true);
delay(1000);
}