« 2021年12月 | トップページ | 2022年6月 »

2022年1月

2022年1月23日 (日)

大型7セグLEDを4個使った表示装置

Cimg9863

 先日Amazonで買った74HC595がたくさん余ってるので,以前デジットで1個100円で買った1.5inchの大型7セグLED(アノードコモン) 4個を使ってArduino用の4桁7セグLED表示装置を作ってみました。
回路はこのシールドをマネしてこんな感じ↓
Untitled-sketch_

a~gのセグメントはそれぞれLEDが2個直列になってるので電流制限抵抗がなくても それぞれ6mA程度しか流れませんでしたが,DpはLED1個なので,220Ωの電流制限抵抗を入れました。
Arduinoからは SDI,LAT,CLKの3本の線でコントロールできるから便利です。
参考スケッチ ↓

//大型7segLED4個 + 74HC595を2個でカウントアップ

#define SDI 8
#define LAT 9
#define CLK 10
const byte digit[] = //7seg 点灯パターン(アノードコモン)
{
 B00000011, // 0 ( abcdefgDp )
 B10011111, // 1
 B00100101, // 2
 B00001101, // 3
 B10011001, // 4
 B01001001, // 5
 B01000001, // 6
 B00011011, // 7
 B00000001, // 8
 B00001001 // 9
};

const byte segment[] =
{
 B00000000,
 B10000000, //左端の7セグLED
 B01000000, //
 B00100000, //
 B00010000 //右端の7セグLED
};

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

void loop() {
 for (int i=0; i < 10000; i++){
  Disp(1,i/1000);
  Disp(2,i%1000/100);
  Disp(3,i%100/10);
  Disp(4,i%100%10);
 }
}

void Disp(byte seg,byte value){
 digitalWrite(LAT, LOW);
 shiftOut(SDI, CLK, LSBFIRST,digit[value]);
 if (seg == 2) {
  shiftOut(SDI, CLK, LSBFIRST, digit[value]&B11111110); //左から2番目の7セグLEDに小数点をつける
 }
 shiftOut(SDI, CLK, LSBFIRST,segment[seg]);
 digitalWrite(LAT, HIGH);
 delay(2);
}

  

| |

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月 6日 (木)

aitendo 2022 お楽しみ福袋

Cimg9843
もう1週間前のことですが,通販でaitendoのお楽しみ福袋(税別2,022円)を買ったので,中身をご紹介します。限定100袋が数分で完売してしまったようです笑
Cimg9831
高音質・高感度・作りやすいAMラジオキット [K-EZ7642BXA2]
AMラジオICを使った,乾電池1個で動くラジオのキット。これはいいですね。
Cimg9829
あちゃんでいいの [AKIT-ADINO]が2個
CR類が各1個分しか入ってないのに,基板は各3枚も入ってます。ATMega328Pも買わないとw
Cimg9830
VFD表示器 [6-BT-321GNK]
★0.36★4桁7セグLED表示器(赤色) [ZDS4-G369SRB-7.7]
4桁7セグLED表示器 [YHA2681HRK]
4桁7セグLED表示器 [YH-4043HS]
★0.28★4桁7セグLED表示器(黄緑色) [BW428G-E1-10MM]
4桁LED表示器:LIM-2843G-11

Cimg9832
巨大なセグメント液晶モジュール [CM1441A-V4]

Cimg9837
bigグラフィックス液晶モジュール★SPI★ [WOM12864J5]

Cimg9833
大型LCDモジュール (仕様不明)

Cimg9835
ワイヤレスモジュール [MW-R-WX]

Cimg9838
サーモスタット式温度スイッチ [KSD301]

Cimg9839
★φ10x17★ツマミ [KN1017A]

Cimg9836
100μF-450V 電解コンデンサ

Cimg9842
ミニ ユニバーサル基板各種

Cimg9834 基板用 各種コネクタ

総額2,022円以上の品が入ってるのは確かですが,扱いに困るものもあるなw
まあ ぼちぼち遊びまーす。

| |

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月 | トップページ | 2022年6月 »