micro:bit キャラクタ表示LCDの接続
micro:bitは、LEDやボタン、加速度センサ、地磁気センサがついていて面白いのですが、ちょっとした表示をしてみたいこともあります。I2C接続AQMシリーズのキャラクタ表示LCDを接続してみます。
秋月電子で購入した安価なI2C接続小型LCDモジュール(8×2行)ピッチ変換キット[AE-AQM0802]を使います。本当は、Raspberry piで使用するつもりで購入しておいたのですが、このような問題がありバス・リピータが必要なようです。代わりにmicro:bitで使うことにします。
micro:bitには加速度センサと地磁気センサが搭載されています。せっかくLCDを接続するので、加速度センサの値を表示できるようにします。さらに、こちらを参考にLEDマトリックスで加速度センサの値を表示するようにします。
■Arduino IDE インストール
開発環境は。Arduino IDEを利用します。こちらの本家サイトからArduino 1.8.12(2020年4月12日時点)をダウンロードしてインストールします。
■Arduino設定
メニューから
ファイル > 環境設定 > 設定
追加のボードマネージャーのURLに
https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json
を入力してOKを押します。
ツール > ボード > ボードマネージャ
検索欄に「nRF」を入力。[Nordic Semiconductor nRF5 Boards by Sandeep Mistry」を選択、インストール。
ツール > ボード > ボードマネージャ
使用するボードをBBC micro:bitにします。
ツール > Softdevice
「S110」を選択します。
ツール > シリアルポート
micro:bitで使用する仮想COMポートを選択します。
次のテストコードを入力して書き込みます。
成功すると、1つのLEDが1秒ごとに点滅します。
const int COL1 = 3; const int LED = 27; void setup(){ Serial.begin(9600); pinMode(COL1, OUTPUT); digitalWrite(COL1, LOW); pinMode(LED, OUTPUT); } void loop(){ digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); }
■LCDの接続
micro:bitのピン配置を参考に接続します。micro:bitの+3V3、SCL(P19)、SDA(P20)とGNDをLCDに接続します。
■加速度センサの確認とライブラリのインストール
micro:bitボードは製造された時期によって2種類あるようです。
こちらを参考にどちらのセンサが搭載されているか確認します。
センサが2つなら
・地磁気センサ= MAG3110
・加速度センサ = MMA8653
センサが一つなら
・地磁気/加速度センサ= LSM303AGR
だそうです。今回使用するのはセンサ2つのタイプですので、MMA8653のライブラリをインストールします。
Arduino IDEにライブラリをインストールします。こちらを参考に加速度センサのライブラリをzipからインストールします。zipファイルを同サイトからダウンロードして、Arduino IDEから
スケッチ > ライブラリをインクルード > Zip形式のライブラリをインクルード
で、ダウンロードしたZipファイルを選択・インクルードします。
また、簡単にLEDマトリックスを使用するために、こちらを参考にAdafruit Librariesをインストールします。
■実行
下記のコードをスケッチに記述しmicro:bitに書き込みます。ボードの傾き程度に応じてLCDに表示される加速度センサの値が変化し、LEDマトリックスの店頭位置が変化します。また、
ツール > シリアルモニタ
でシリアルモニタを表示させておくと、加速度センサXYZの値を連続して表示し続けます。
#include <Wire.h> #include "MMA8653.h" #include <Adafruit_Microbit.h> MMA8653 accel; Adafruit_Microbit_Matrix microbit; unsigned char lcd_address = 0x3e; // LCD slave int n = 0; int i2cwritecmd(byte cmd) { Wire.beginTransmission(lcd_address); Wire.write((byte)0x00); Wire.write(cmd); return Wire.endTransmission(); } int i2cwritedata(byte data) { Wire.beginTransmission(lcd_address); Wire.write(0x40); Wire.write(data); return Wire.endTransmission(); } void lcdcu_set(int x, int y) { byte ca = (x + y * 0x40) | (0x80); i2cwritecmd(ca); } void lcdclear() { i2cwritecmd(0x01); } void lcdhome() { i2cwritecmd(0x02); } void dsift_l() { i2cwritecmd(0x1C); } void dsift_r() { i2cwritecmd(0x18); } void i2cprint( String pdata) { int n = pdata.length(); for (int i = 0; i < n; i = i + 1) { i2cwritedata(pdata.charAt(i)); delay(1); } } void init_lcd() { delay(145); i2cwritecmd(0x38);delay(1); i2cwritecmd(0x39);delay(1); i2cwritecmd(0x14);delay(1); i2cwritecmd(0x73);delay(1); i2cwritecmd(0x56); //3.3V delay(1); i2cwritecmd(0x6c);delay(300); i2cwritecmd(0x38);delay(1); i2cwritecmd(0x01);delay(2); i2cwritecmd(0x0C);delay(2); } int sensorPin = A0; int sensorValue = 0; void setup() { Wire.begin(); init_lcd(); Serial.begin(9600); Serial.println("microbit accel test"); microbit.begin(); accel.begin(false, 2); // 8-bit mode, 2g range } void loop() { lcdclear(); accel.update(); int px = accel.getX(); int py = accel.getY(); int pz = accel.getZ(); Serial.print(px); Serial.print(" , "); Serial.print(py); Serial.print(" , "); Serial.println(pz); i2cprint(String(px));i2cprint(String(", ")); i2cprint(String(py));i2cprint(String("")); for (int x = 0; x < 5; ++x) { for (int y = 0; y < 5; ++y) { if (x == px && y == py) microbit.drawPixel(x, y, LED_ON); else microbit.drawPixel(x, y, LED_OFF); } } delay(1000); }