2022年1月16日 (日)

Arduinoで作ろう(61) Digisparkで7セグLED温度計

Digispark_lm35_7segled_

 またまたDigisparkに温度センサLM35DZをつないで温度計をつくりました。
今度の表示装置はLCDではなく秋月電子通商の74HC595付き7セグLEDです。
この秋月の7セグLEDはほんとに便利なパーツで,マイコンから3本の線でつなぐだけだし どんどん並べることもできるので使ってて楽しいですよ。オススメです。

// Digispark に秋月の74HC595の7セグLEDを接続
// LM35DZで温度計

#define SDI 0
#define LAT 1
#define CLK 2
#define tempPin A2
float value;
int temp,temp1,temp2,temp3;
const byte digits[] = {
0b11111100, // 0
0b01100000, // 1
0b11011010, // 2
0b11110010, // 3
0b01100110, // 4
0b10110110, // 5
0b10111110, // 6
0b11100000, // 7
0b11111110, // 8
0b11110110, // 9
};

void setup() {
 pinMode(tempPin,INPUT);
 pinMode( SDI, OUTPUT );
 pinMode( LAT, OUTPUT );
 pinMode( CLK, OUTPUT );
}

void loop() {
 value=analogRead(tempPin);
 temp = (value*5000)/1024;
 temp3=temp/100;  //10の位
 digitalWrite( LAT, LOW );
 shiftOut( SDI, CLK, LSBFIRST, digits[temp3] );
 digitalWrite( LAT, HIGH );
 temp2=(temp%100)/10;   //1の位
 digitalWrite(LAT, 0);
 shiftOut( SDI, CLK, LSBFIRST, digits[temp2]|0b00000001 );
 digitalWrite(LAT, 1);<br/temp1=temp%10;   //0.1 の位
 digitalWrite(LAT, 0);
 shiftOut( SDI, CLK, LSBFIRST, digits[temp1] );
 digitalWrite(LAT, 1);
 delay(1000);
}

| |

2022年1月14日 (金)

Digisparkのファームウエア修復

Fusewriting2_

 avrdude.exe を使ってDigisparkのファームウエア(ブートローダ)の修復をやってみました。
パスを長々と書くのは面倒なので,Dドライブのルートに avrdude-64 というフォルダを作って,その中にavrdude.exeとavrdude.confとココで手に入れたファームウエアt85_default.hexを入れて作業開始です。もちろん,ArduinoにはArduinoISPを入れてAVRライタとして使います。

avrdude -D -C avrdude.conf -v -pattiny85 -cstk500v1 -P COM3 -b19200 -Uflash:w:t85_default.hex:i -U lfuse:w:0xf1:m -U hfuse:w:0xdf:m -U efuse:w:0xfe:m

コマンドプロンプトから上のコマンドを打ってやると,↓ こうなりました。(COM3はArduinoがつながってるシリアルポートです)

Firmware

 どうやらうまくいったようなので,Digisparkを取り外してスケッチを書き込んでやると 今度はちゃんとUSBで認識されて書き込みにも成功しました♪
こういうトラブルに見舞われると,勉強になりますなあ。とりあえずP5はリセット設定のままにしておくかな。

 

| |

2022年1月12日 (水)

Digisparkのヒューズリセット

 何かヘンな操作をしてしまったのか,中華パチもんDigisparkにスケッチを書き込めなくなりました。
USB端子に挿しても認識しないからファームウエアが壊れたっぽいんだけど,とりあえず 先日書き換えたヒューズビットを元に戻してみます。
ヒューズビットというのは「AVRのチップの動作を設定するパラメタのビット 」なんだそうですね。このサイトの説明が丁寧でよく分かりました。
そもそもP5をリセット端子に設定しておかないと外部リセットがかからないからファームウエアの書き換えもできないみたいです。
Fuse_reprogrammer_

 ココココに書いてあることをマネして 上図の回路を組みました。Arduinoのスケッチはココにあるものです。
D8はATtiny85のVCC(8ピン)につなぐ必要があるのですが,Digisparkの5V端子に接続すれば大丈夫です。

 Arduino IDEのシリアルモニタを起動し,何か適当な文字を1文字入力して送信ボタンを押下すると,こうなりました ↓
Fusereset
 3行目が書き換え後の値なんだけど (Lfuse,Hfuse,Efuse) は (62,DF,FF) が ATtiny85 のデフォルト値なのかしら? 確か購入直後のこの中華バチもんDifisparkは(E1,DD,FE)だったよなあ。
とりあえずDigisparkを取り外して 適当なスケッチを書き込んでやろうとしたんだけど やっぱり失敗。USBで認識できなくて Time Out してしまいます。こりゃファームウエア(ブートローダ)を修復しないとダメっぽいですねえ。
(次回に続く...)

| |

2022年1月10日 (月)

Arduinoで作ろう(60) Digisparkでデジタル時計

Digispark_ds3231_i2c_lcd1602_

 DigisparkにRTCとLCDを2つともI2Cでぶら下げて デジタル時計をつくってみました。
リアルタイムクロック DS3231のライブラリは TinyRTClib.h です。これは DS1307 でも DS3231 でも使えるみたい。

//リアルタイムクロック DS3231 を使ったデジタル時計

#include <TinyWireM.h>
#include <LiquidCrystal_I2C.h>
#include <TinyRTClib.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);    //I2Cアドレス 0x27
RTC_DS1307 RTC;    //DS3231だけど,これでOK

void setup(){
 TinyWireM.begin();
 RTC.begin();
 lcd.init();
 lcd.backlight();
// DS3231の日時をコンパイルした時刻に設定するなら下行のコメントアウトを外す
//RTC.adjust(DateTime(__DATE__, __TIME__));
}

void loop(){
 char buff[12] ;
 DateTime dt = RTC.now();
 sprintf(buff, "%04u/%02u/%02u", dt.year(), dt.month(), dt.day()) ;
 lcd.setCursor(0, 0) ;
 lcd.print(buff) ;
 sprintf(buff, " %02u:%02u:%02u", dt.hour(), dt.minute(), dt.second()) ;
 lcd.setCursor(0, 1) ;
 lcd.print(buff) ;
 delay(100) ;
}

| |

2022年1月 8日 (土)

Arduinoで作ろう(59) DigisparkのP5を使えるようにした

Fusewriting2_

 Amazonのカスタマーレビューや 他のWebサイトに書いてあることを読んだところ,「ヒューズビットを書き換えれば 現状RESETに割り当てられているP5 を入出力端子として使えるようになる」ということが分かりました。
ヒューズビットって何? という疑問はとりあえず放置しておいて,先人の教えに沿ってやってみました。
 まず,ArduinoISPを書き込んだArduino と 中華パチもんDigispark を上図のように接続し,ArdunoをパソコンのUSB端子につなぎます。
パソコンにはココでダウンロードした avrdude.exe を用意しておきます。
コマンドプロンプトで,以下のように謎のコマンドを打つと,現在の設定値が分かります。
20220103_image1 四角で囲んだ DD を 5F に変えればいいんだそうです。続けて謎のコマンド2を打ちます。
20220103_image2
よく分からずにやってますが,設定値DD を 5F に変えることができたようです。これでほんとにP5は入出力に使えるようになったのかな?
中華パチもんDigisparkに簡単なスケッチをアップロードしてみました。

void setup() {
 for ( int i=0; i<6; i++ ){
 pinMode(i, OUTPUT); digitalWrite(i, LOW);
 }
}

void loop() {
 for ( int i=0; i<6; i++ ){
 digitalWrite(i, HIGH);
  delay(200);
 digitalWrite(i, LOW);
  delay(200);
 }
}

お,P5のLEDもピカピカしてますね。うまくいったようです。

 

| |

2022年1月 2日 (日)

Arduinoで作ろう(58) DigisparkとLM35で温度計

Digispark_lm35_i2c_lcd1602_

20220102-152149

 Digisparkに温度センサLM35DZをつないで温度計を作ってみました。表示装置は,I2C接続のLCDです。
ブレッドボード上にパーツを配置し始めてから気がついたのですが,普通のブレッドボードは端にある電源ラインの穴とパーツを配置する部分の穴が少しズレてるんですね。サンハヤトの SAD-101はズレてないので,Digisparkを使うならこれがオススメです。

 I2C接続のLCD1602を使うには,C:\Users\USER\AppData\Local\Arduino15\packages\digispark\hardware\avr\1.0.0\
libraries\DigisparkLCD の中にあるライブラリ LiquidCrystal_I2C.h を使うようですが,本家Arduinoのライブラリにも LiquidCrystal_I2C.h があって同名なので,これがあるとうまくコンパイルが通りません。一時的に本家の方をリネームして衝突を回避しました。

// 温度計 LM35DZ + I2C_LCD1602
#include <TinyWireM.h>
#include <LiquidCrystal_I2C.h>
#define tempPin A2
LiquidCrystal_I2C lcd(0x27, 16, 2); //I2Cアドレス 0x27

float value;
float temp;

void setup(){
 pinMode(tempPin,INPUT);
 TinyWireM.begin();
 lcd.init();
 lcd.backlight();
}

void loop(){
 value=analogRead(tempPin);
 temp = (value*500)/1023;

 lcd.setCursor(0,0);
 lcd.print("temperature:");
 lcd.setCursor(9,1);
 lcd.print(temp); lcd.write(0b11011111); lcd.print("C");
 delay(1000);
}

 あと2つヘンなことがあります。まず,LM35の出力を接続できるはずのDigisparkのアナログinputのA0からA3のうち,A2しか使い物になりませんでした。A0とA3だとデタラメな数字がLCDに表示されます。なんで?
 もうひとつ,Digisparkが完全に起動した後にA2にLM35出力を接続しないと ちゃんと測定できないのです。この2つのトラブルで5時間くらい時間を無駄にしました...。僕が買ったのが,中華製のパチもんDigisparkだからかなあ?

【追記】
Amazonのカスタマーレビューを見たら少しわかってきました。
中華パチもんDigisparkは,P5がRESETに割り当てられてるみたいですね。試しにP5をGNDにちょんと触ったらリセットがかかりました。
あと,DigisparkをUSB端子につないでるときは P3とP4は他の用途に使えないみたい。なーんだ。
Attiny85pinout

 

| |

2021年12月31日 (金)

Arduinoで作ろう(57) DigisparkでLチカ

Digispark

 大晦日だというのに 一昨日 Amazonで買った Digispark で遊んでますw
昨今の半導体不足のせいで少々値上がりしてるようで1枚500円程度しますが,上の写真のようにめっちゃ小さくてパソコンのUSB端子に直接挿せるようになってます。
Digisparkpinout

 DigisparkはATtiny85を載せたV-USBデバイスで,ArduinoみたいにUSB-シリアル変換することなくUSB経由で直接書き込むことができます。Arduino UNO等に使われているATMega328Pとスペック比較するとこんな感じ。

  GPIO Flash EEPROM RAM ADC PWM
ATtiny85 6 8KB 512B 512B 4 2
AtMega328P 23 32KB 1KB 2KB 6 6

 

 

 

実際に使えるFlashメモリは6KB程度みたいなので大したことはできそうもありませんが,コロナ禍において在宅ワークしてるサラリーマンがこれを使って「5分ごとにマウスを1px動かす」なんてことをしてたようです。しょうがねえなーw

Digisparkのドライバのインストール
 まずは,このサイトに書いてあることをマネして,DigisparkをWindows10に認識させるために libusb-win32のドライバをインストールしました。
micronucleus-2.0a4-win.zipをダウンロードして展開し DPinst64.exeを実行すると,デバイスマネージャでDigisparkが認識されたことが確認できました。

202112311

ボードマネージャのインストール
 次に Arduino IDEを起動し,「ファイル」→「環境設定」で「追加のボードマネージャのURL」に http://digistump.com/package_digistump_index.json と入れるのが標準的なやり方のようですが,このサイトを見てたら「avr-gccの旧バージョンがオーバライドされ,現行のArduino IDE ver. 1.8.5のavr-gccで可能だったATtiny10系向けのコンパイルができなくなります」なんてことが書いてあったので,この方のアドバイスに従って https://kimio-kosaka.github.io/digispark-clone/package_digispark-clone_index.json と書いてやることにしました。

 そうすると,ボードマネージャに Digispark AVR Boards(clone) ってのが現れるので,これをインストールします。(下図はインストール後の画面です)
202112312

サンプルスケッチの書き込み  
 スケッチを書き込む準備ができたので,Digispark Exampleの中にある Start というLチカのスケッチを書いてやりましょう。
202112313

 ボードは Digispark(Default-16.5mhz) ,書き込み装置は Micronucleus を選びます。
で,ここが大事なのですが DigisparkをUSB端子から取り外した状態で「マイコンボードに書き込む」ボタンを押します。
202112314
上のように,「plug in device now...」のメッセージが出たら,1分以内にDegisparkをUSB端子に挿入します。
202112315 「Micronucleus done. Thank you!」となったら書き込み成功です💓


| |