安価なマイコンMh-Tiny88を入手しました。
Arduino環境でのスケッチを書き込んでみます。
基本的なIO制御、通信(UART)を使ってみます。
紹介するもの
Mh-Tiny88
特徴
接続 | Mini B |
CPU | AVR ATTiny 16MHz |
メモリ | フラッシュメモリ8KByte |
ロジックレベル | 5V |
GPIO | 23 |
PWM | 2 (8bit 0 ~ 255) |
ADC | 8 (10bit 0 ~ 1023, 5V) |
UART | 0 |
I2C | 1 |
SPI | 1 |
その他 | LED赤 (GPIO0) |
ピン配置
外観
Arduino nanoと比べてみました。
基板サイズは若干MH-Tiny88のほうが大きいですが、コネクタを含めると同等です。
ピンの数や幅は同じです。
基板上には双方にRESETボタンがあります。
Arduino nanoではあまり使う機会はありませんが、MH-Tiny88ではスケッチを書きこむときに使用します。
ボタンが小さめでクリック感(押したと実感できる感触)はありません。
使ってみて
探してまで使用したいと思うボードではありません。
Arduino nanoの入手ができるのであれば、nanoを使いたいと感じます。
学習の躓きや、使いにくいと感じた要素がいくつかあります。
①UARTがない ー> 手軽にデバッグ出力できない。
②スケッチの書き込みリセット操作が必要 ー> 忘れることがある。
③3.3V電源がない ー> 3.3V駆動モジュールを使用する場合ロジックLV変換が必要。
④ADCのピン番号が不明 ー> 指定したピン番号ではない番号で機能する。
⑤I2C, SPIライブラリが弱い ー> OLEDやLCDを制御するライブラリがMh-Tiny88に対応していない。
Arduino環境やマイコンの操作に慣れた人が根気よく使うのであれば、値段も手ごろに収まると思いますが、Arduino nanoのように開発を進めることは難しいと感じます。
Arduino nanoもそうですが、このマイコンをArduino環境で使用する良さはコンパイル時間が短いこともあります。
掲載しているサンプル程度のものであれば、2~3秒程度(当開発環境)で終わります。
最近のマイコンでは10秒以上かかるものも珍しくありません。
3Vの電源やロジックレベルが必要になった場合変換モジュールがあります。
Arduino Nanoの性能比較
現在MH-Tiny88の性能は加えていませんが、近々追記しようと思います。
準備
ライブラリ
ボードライブラリ
Arduino IDEのボードマネージャからMh-Tiny88用のライブラリのインストールとボードの選択をします。
ボードマネージャのURL | http://drazzy.com/package_drazzy.com_index.json |
検索 | attiny |
ボードライブラリ | ATTinyCore by Spence konde x.x.x※ |
選択するボード | ツール > ボード > ATTinyCore > ATtiny88(Micronucleus, MH-ET t88 w/16MHz CLOCK) |
モジュールライブラリ
機能やモジュールを使用しない場合インストールの必要はありません。
機能/モジュール | ライブラリ名 | 検索 | 確認時のバージョン |
---|---|---|---|
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 |
スケッチの書き込み
手順があります。
Mh-Tiny88をUSBケーブルで接続していても、していなくてもかまいません。
接続できる用意はしてください。
1.Arduino IDEの書き込みボタンよりコンパイルと書き込みを開始します。
2.コンパイルが終わると、「出力」ウインドウに
> Please plug in the device (will time out in 60 seconds) …
と表示されるので、Mh-Tiny88をUSBケーブルで接続します。
(すでに接続されている場合は、Resetボタンを押す)
3. 2の操作を行うことで書き込みが開始されます。
USBの接続、またはリセット待ちの状態。
スケッチの書き込みが終了した状態。
トラブル
ADCピン番号
症状
GPIOピン番号を指定しADCの読み取りを行いますが、指定したピン番号ではないピンが機能している。
例えば、GPIO17(A6)をADCとして読み取りを行う設定を行っても、実際にADCの読み取りができるのがGPIO20になる。
ライブラリのマクロ定義ではA6を指定しても定義は17なので、GPIO20が機能する。
(digitalReadの場合は黄緑のGPIO番号で機能する)
対処
ピン配置表を作成しました。
実際のGPIO17(A6)位置をADCとして使用したい場合、緑の22を指定することでGPIO17(A6)位置がADCとして機能する。
基本スケッチ
ボタンLED
説明
タクトボタンとLEDの組み合わせの動作をします。
タクトボタンはプルダウン回路で入力します。(押下したらHIGH)
3.3V -> タクトスイッチ -> GPIO4 -> プルダウン抵抗(10KΩ) -> GND
GPIO5 -> 保護抵抗(200Ω) -> LED -> GND
タクトボタンを読み取り、押下されるとLEDが点灯します。
ボタンが離されるとLEDは消灯します。
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
Mh-Attiny88
【スケッチの説明】
プルダウンしたピンの状態がHighならLEDを点灯、LowならLEDを消灯させます。
【ライブラリ】
ATTinyCore > ATtiny88(Micronucleus, MH-ET t88 w/16MHz CLOCK)
【準備】
5V -> タクトスイッチ -> GPIO4 -> プルダウン抵抗(10KΩ) -> GND
GPIO5 -> 保護抵抗(200Ω) -> LED -> GND
【バージョン情報】
2023/7/25 : 新規
**********************************************************************/
#define LED 5 //LED
#define BUTTON 4 //タクトスイッチ
void setup()
{
pinMode(LED, OUTPUT); //ピン出力設定
pinMode(BUTTON, INPUT); //入力設定
}
void loop()
{
int iStat = digitalRead(BUTTON);
digitalWrite(LED, iStat); //ボタンの状態をLEDに出力
}
結果
ボタンが押下されるとLEDは点灯しました。
ボタンが離されるとLEDは消灯しました。
PWM
説明
PWMを使ってLEDのフェード点灯(ゆっくり点灯させる)を行います。
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
Mh-Attiny88
【スケッチの説明】
PWM制御を使ってLEDをゆっくり点灯、ゆっくり消灯を繰り返します。
【ライブラリ】
ATTinyCore > ATtiny88(Micronucleus, MH-ET t88 w/16MHz CLOCK)
【準備】
GPIO9 -> 保護抵抗(200Ω) -> LED -> GND
【バージョン情報】
2023/7/25 : 新規
**********************************************************************/
//PWM設定可能ピン 9 または 10
#define PWM 9 //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, 255 - i);
delay(2);
}
}
結果
LEDがゆっくり点灯、ゆっくり消灯しました。
ADC
説明
ADCに入力された電圧を読み取りCOMに出力します。
電圧の入力にLOLIN32 Liteを使用します。
0~255(約3.3V) まで2msごとに1ずつ上昇し、255(約3.3V)~0までを2msごとに1ずつ下降する設定を繰り返します。
※スケッチではA1(マクロ定義ではGPIO17)を指定していますが、実際にADCとして機能するのはGPIO20です。
配線はGPIO20に接続します。
配線
Mh-Tiny88 | 配線 | LOLIN32 Lite |
---|---|---|
GPIO20(ADC) | 赤 | GPIO26(DAC) |
GND | 黒 | GND |
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
Mh-Tiny88
【スケッチの説明】
ADCから読み取った電圧をCOMに出力します。
電圧ジェネレータにLOLIN32-Lite使用します。
【ライブラリ】
ATTinyCore > ATtiny88(Micronucleus, MH-ET t88 w/16MHz CLOCK)
【準備】
Mh-Tiny88 <-> LOLIN32-Lite
GPIO20(ADC) - GPIO26
Mh-Tiny88 <-> FT232RL
GPIO1(TX) <-> RX
GPIO2(RX) <-> TX
【バージョン情報】
2023/7/25 : 新規
**********************************************************************/
#include <SoftwareSerial.h>
#define PIN_TX 1
#define PIN_RX 2
SoftwareSerial SWSerial(PIN_RX, PIN_TX);
#define PIN_ADC A1 // 17 ※指定は17、実際にADCが機能するのは GPIO20の位置
void setup()
{
SWSerial.begin(115200);
pinMode(PIN_ADC, INPUT);
}
void loop()
{
char buf[128];
int iADC = 0;
//外部から入力された電圧を読み取り、結果をCOMに出力します。
iADC = analogRead(PIN_ADC);
sprintf(buf, "(ADC) = %d", iADC);
SWSerial.println(buf);
delay(2);
}
結果
入力した電圧を読み取った結果をグラフにしました。
電圧の変化は0V -> 3.3Vまでを約500msで上昇し、3.3V -> 0Vまで約500msで下降します。
MH-Tiny88のアナログ入力の最大電圧は5Vです。
5Vでは1024(AD)なので、3.3Vの入力だと概ね670(AD)になります。
正確に読み取れています。
0Vから3.3Vの変化をする電圧をオシロスコープで確認しました。
3.3Vまできれいに出力されています。
UART
説明
Mh-Tiny88にはUARTがありません。
UART出力をするために、ソフトウエアUARTライブラリを使用します。
スケッチは、読み取った内容をそのまま返答します。
配線
Arduino nano | 配線 | FT232RL |
---|---|---|
GPIO1(TX) | 黄 | RX |
GPIO2(RX) | 緑 | TX |
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
Mh-Tiny88
【スケッチの説明】
Mh-Tiny88にはUARTがないため、ソフトウエアUARTを使用します。
読み取った文字をそのまま返答します。
【ライブラリ】
ATTinyCore > ATtiny88(Micronucleus, MH-ET t88 w/16MHz CLOCK)
【準備】
Software Serial(UART)の通信には、FT232RLを使用します。
Mh-Tiny88 <-> FT232RL
GPIO1(TX) <-> RX
GPIO2(RX) <-> TX
【バージョン情報】
2023/7/25 : 新規
**********************************************************************/
#include <SoftwareSerial.h>
#define PIN_TX 1
#define PIN_RX 2
SoftwareSerial SWSerial(PIN_RX, PIN_TX);
void setup()
{
SWSerial.begin(115200);
}
void loop()
{
if(SWSerial.available() != 0) //SoftwareSerial(UART)にデータがあれば、読み取った内容をCOMに送信
{
SWSerial.write(SWSerial.read());
}
}
結果
結果はTeratermを起動して確認します。
Local EchoはOnです。
キーボードから入力下文字と同じ文字が連続して表示されます。
最初の文字はLocalEchoにより入力しMh-Tiny88に送信下た文字、次の文字はMh-Tiny88からの返答をTeratermが読み取った文字です。
コメント