Arduino環境でMh-Tiny88を使う

コンピュータ、組み込み

安価なマイコンMh-Tiny88を入手しました。
Arduino環境でのスケッチを書き込んでみます。
基本的なIO制御、通信(UART)を使ってみます。

紹介するもの

Mh-Tiny88

特徴

接続Mini B
CPUAVR ATTiny 16MHz
メモリフラッシュメモリ8KByte
ロジックレベル5V
GPIO23
PWM2 (8bit 0 ~ 255)
ADC8 (10bit 0 ~ 1023, 5V)
UART0
I2C1
SPI1
その他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用のライブラリのインストールとボードの選択をします。

ボードマネージャのURLhttp://drazzy.com/package_drazzy.com_index.json
検索attiny
ボードライブラリATTinyCore by Spence konde x.x.x※
選択するボードツール > ボード > ATTinyCore > ATtiny88(Micronucleus, MH-ET t88 w/16MHz CLOCK)
※ x.x.x 動作確認は1.5.2を使用しています。

モジュールライブラリ

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

機能/モジュールライブラリ名検索確認時のバージョン
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

スケッチの書き込み

手順があります。
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)
GNDGND
スケッチ
/**********************************************************************
【ライセンスについて】
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が読み取った文字です。

コメント

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