2024年9月21日 (土)

ATtiny402 + LM35DZ で温度計

202409201

 秋月電子通商でATtiny402の取り扱いが始まったので(1個70円),さっそく買って試してみました。
以前,ATtiny202を使ってみたのですが プログラムメモリが2KBしかなくて,なかなか使いどころが難しいなあと感じました。今回のATtiny402は,2倍の4KBあるので前回できなかった温度計を作ってみることにしましょう。
202409202Attiny402

 まずは,SOP8パッケージのATtiny402を秋月のSOP8→DIP変換基板を使ってDIP化します。

202409204

 前回,Arduino IDEのボードマネージャで「megaTinyCore」をインストールしたので,ATtiny402もすぐに使えます。
温度センサLM35DZI2C接続のLCD1602を接続してスケッチを書いてみます。

Attiny402_lm35_lcd__20240920202901

//温度計 LM35 + I2C_LCD1602
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define tempPin A3
LiquidCrystal_I2C lcd(0x3F, 16, 2); //I2Cアドレス 0x3F
float value;
float temp;

void setup(){
pinMode(tempPin,INPUT);
Wire.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.print(temp,1); lcd.write(0b11011111); lcd.print("C");
delay(1000);
}

パソコンとの接続にはUSB-TTL変換基板を使って,UPDI(Unified Program and Debug Interface)で書き込むことにします。
Arduino IDEの設定は次のようにして書き込みます。そうすると,こんな小さなスケッチなのにプログラムメモリ4KBのうち86%が使われてしまいました。ライブラリなんか使わないで生でゴリゴリやらないとダメなんでしょうかねw
202409203

ところで,lcd.print(temp) じゃなくて,lcd.print(temp,1) と書いてやると,小数点以下を1桁にしてくれるんですね(小数点以下第2位を四捨五入)。知らなかった :D

| |

2024年4月17日 (水)

aitendo「ESP-32でいいの」っぽい謎ボードでLチカ

Img18372
 以前紹介したaitendo 2024お楽しみ福BOXに入っていた「ESP-32でいいの」っぽい謎のボードで遊んでみました。

R32d1pinout
 ↑ aitendoのWebサイトで販売中(再入荷準備中)のボードはESP32が載ってるんだけど,2024お楽しみ福BOXに入ってたのはESP32が載ってないし,ボードの色が違うし,USB端子がタイプCになってるし,どうみても別物なんだけど現在のところaitendoで販売されてません。ひょっとしたら基板は作ってみたものの発売を断念しちゃったモノなのかも。
このボードがほんとに使えるものなのかどうだか分かりませんが,AliExpressで400円弱のESP32-WROOM32を買ってはんだ付けしてみようと思います。

Img1838
 はんだ付けしてるときにズレちゃうと困りますから gootのヒートクリップでがっちり挟んで動かないようにします。このヒートクリップはチップ部品やSOPパッケージのICをはんだ付けするときにホントに便利ですよ。ぜひ使ってみてください。

Img1839
 しっかり押さえつけたからと言ってもこれはなかなか大変そう(^^;) HOZANのフラックスを塗ってから,Φ 0.6mmの糸ハンダを使ってはんだ付けに挑戦です。

Img1840
 ハンダブリッジしちゃったらハンダ吸い取り線を使ってやれば大丈夫です。ちょっと不細工なところもあるけど,なんとか完成!

 とりあえずLチカをやってみます。LEDはアリエクで買ったコレを使ってみます。Arduinoのボードにそのまま挿せるから便利です。

//ESP-32でいいの(?) Lチカ
int led[] = {12,13, 5,23,19,18};
void setup() {
for (int i=0; i <= 5; i++){
pinMode(led[i], OUTPUT);
}
}

void loop() {
for (int i=0; i <= 5; i++){
digitalWrite(led[i], HIGH);
delay(100);
digitalWrite(led[i], LOW);
delay(100);
}
}

 とりあえずちゃんと動くみたいです。Wi-Fiも使ってみないとなー。

| |

2024年3月25日 (月)

ATtiny202 で Hello World!

Artiny202_pinout_20240325105401

 最近,秋月電子で ATTINY202 DIP化キット ってのが取扱い開始になりましたが,昨年末にATtiny202SOP8→DIP変換基板でDIP化し,Arduino IDEでスケッチを書いてHello World をやったのを思い出したので,書き残しておきます。
Img0796

 老眼の僕にとってはなかなか厳しいハンダ付け作業でしたが なんとかATtiny202のDIP化基板を完成させ,Lチカのスケッチを書き込んでみました。
先達がお書きになったブログを見るとブートローダを書き込んでる人が多いみたいですが,ブートローダはなくでも大丈夫みたいです。
パソコンとの接続にはUSB-TTL変換基板を使うことにしましょう。
 まず初めに,Arduino IDEで「追加のボードマネージャのURL」に「http://drazzy.com/package_drazzy.com_index.json」を入力 してから,ボードマネージャで「megaTinyCore」をインストールします。
Megatinycore_20240325105901

 次に,下図のように接続して,UPDI(Unified Program and Debug Interface)という方法で書き込むことにします。電源以外は1本の線だけで通信できるのがいいですね。ただ,470Ωの抵抗やショットキーバリアダイオード(パーツ箱にあった1SS108を使いました)が必要です。 Attiny202__20240325110001

 Arduino IDEの設定は下図のようにして,Lチカのスケッチを書き込んでみました。
Tool_20240325110901

Cimg1102_20240325111401

 うまくいきました :D 調子に乗って,LCD1602をつないでHello World をやってみました。

Attiny202_lcd__20240325112101

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);

void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hello World");
}

void loop() {
for(int i=0x30;i<=0x7F;i++){
lcd.setCursor(i%16, 1);
lcd.write(i);
lcd.print(" ");
delay(300);
}
}

動画でどうぞ↓

| |

2023年12月29日 (金)

CH32V003+I2C接続のLCDでHello World !

 CH32V003F4P6開発ボードにI2CでLCDをつないでHello World !と表示させてみました。
また,秋月電子で1個40円の8ピンSOP CH32V003J4M6 を買ったので,これでも同じことをやってみました。
Shotcut_00_00_29_280
開発ボードとデバッガWCH-LinkE前回と同様,このように↓ 接続します。
M18065_20231229124201

スケッチはこんなかんじ↓

//CH32V003 + AQM1602でHello World
//SDA,SCLを10kΩでプルアップ

#include <Wire.h>
#define LCD_ADR 0x3E
char buf[]="";

void writeCmd(byte cmd){
Wire.beginTransmission(LCD_ADR);
Wire.write(0x00);
Wire.write(cmd);
Wire.endTransmission();
delay(1);
}

void writeData(byte data){
Wire.beginTransmission(LCD_ADR);
Wire.write(0x40);
Wire.write(data);
Wire.endTransmission();
}

void setCursor(byte clm,byte row){
if(row==0) writeCmd(0x80+clm);
if(row==1) writeCmd(0xc0+clm);
}

void init_LCD() {
writeCmd(0x38);
writeCmd(0x39);
writeCmd(0x56);
writeCmd(0x6C);
writeCmd(0x01);
writeCmd(0x0C);
}

void strPrint(char *str){
while(*str != 0)
writeData(*str++);
}

void numPrint(int num){
String strnum = String(num);
strnum.toCharArray(buf,10);
strPrint(buf);
}

void setup() {
Wire.begin();
init_LCD();
setCursor(0,0);
strPrint("Hello World!");
}

void loop() {
setCursor(0,1);
numPrint(millis()/100);
}

LCDは秋月電子で買ったAQM1602で,マイコンボードとはこのようにつなぎます。SDAとSCLは10kΩくらいの抵抗でプルアップすることを忘れずに。

Untitled-sketch_2

 このマイコンボードはうまくいったので,続けて8ピンSOPのCH32V003J4M6 でも同じことをやってみました。SOP8のままではブレッドボードに刺さらないのでDIP変換基板を使います。

プログラムをアップロードするときはこうやって↓ つないで,
202312282
LCDはこうつなぎます↓
Untitled-sketch_4

では,動画をご覧ください。

| |

2023年12月20日 (水)

CH32V003F4P6 開発ボードでLチカ

Cimg1180

 前回の続きです。32ビットRISC-VマイコンCH32V003F4P6開発ボード用のプログラマ・デバッガ WCH-LinkEが注文後2週間かかって中国深圳から届いたので,Lチカをやってみました。
971594304_max_2

◆ WCH-LinkEのモードを「WCH-LinkRV」に設定する

 まず,WCH-LinkEでCH32V003に書き込みができるように,ココで WCH-LinkUtility をダウンロードして WCH-LinkUtility.exe を実行します(インストール不要の実行ファイルです)。

20231202_1

Active WCH-Link Mode で プルダウンメニューからWCH-LinkRV を選んで,Set すればOK。

◆ Arduino IDE のボードマネージャで CH32 MCU EVT Boards をインストール

 次にArduino IDE の設定です。ボードマネージャーのURLに以下のURLを追加して,

https://raw.githubusercontent.com/openwch/board_manager_files/
main/package_ch32v_index.json

ボードマネージャでCH32で検索すると見つかる CH32 MCU EVT Boards をインストールしてやります。

Image202312191

WCH-LinkEとマイコンボードを下のようにつなぎます。3本でいいからラクですね。
M18065

◆ あれれ? スケッチ書き込みに失敗!

 Arduino IDE でマイコンボードはCH32V00X を選んでLチカのスケッチを書き込んでやろうとしたら,エラーが出て書き込みに失敗しました。
Image4_2_20231220051701

Error: WCH-Link failed to connect with riscvchipっていうことですから,マイコンチップを認識できてないみたい。困りましたね。
んで,ネット検索して見つけたのは秋月電子のWCH-LinkEエミュレーターの質問と回答というページ。

【質問】 一度プログラムをダウンロードしたら再度ダウンロードできなくなりました。[2023/06/21 11:05:55]
【回答】 プログラムのダウンロードに使用しているピンで、その他(SWDIO以外)の機能が有効となっていると通信できずに失敗します。ダウンロードしたプログラムを削除してから、改めてダウンロードをお試しください。

MounRiver Studio(MRS)のメニューの...
Flash→Configurationで開くダイアログで、Clear Code Flashを実行します。
なお、CH32V003J4M6については外部にリセットピンがありませんので、電源OFFでリセットをかける必要があります。
Clear Code Flash実行時に、By Power offを選択してApplyしてください。(2023.06.21 現在)

 そういえば,このマイコンボード,通電すると基板上のチップLEDが点滅するから,あらかじめ何かのプログラムが書き込まれてるっぽいです。それを消しちゃえばいいのかも。

◆マイコンをキレイに掃除しましょ

MounRiver Studio という巨大なアプリケーション(ストレージを4.4GBも占有する!)をインストールし,メニューから Configration に入って Erase Code Flash を実行します。
Image6_20231220060001

 すると,基板上のチップLEDが消灯したので,マイコンチップはキレイに掃除できたみたい。で,すかさず Arduino IDE でLチカスケッチを書き込んでみると,今度はちゃんと書き込みに成功しました :D
 その後,MounRiver Studio を使わなくても WCH-LinkUtility で Erace Chip できることを発見したので,MounRiver Studio は速攻でアンインストールしましたとさw

202312201

このマイコンボード,送料込み364円と安いけど まあまあのスペックなので,これからも使ってやろうかな。

| |

2023年12月 7日 (木)

Arduinoで作ろう(64) カラフルな影

Cut_00_03_03_287

 「智恵の楽しい実験」にある「影は何色?(赤・緑・青の光が作る影)」をマネして作ってみました。クリスマスっぽいネタですなあ :P
 智恵さんは3WのハイパワーRGB LEDを使ってPWMで制御されてるようですが,僕はお手軽にマイコン内蔵RGB LED WS2812Bってのを使ってみました。

Ws2812b_

 ココにあるAdafruit NeoPixelライブラリを使うとスケッチもすごくコンパクトになります。下のスケッチは,動画の後半部分の「3個のLEDの色をじわじわ変える」やり方を示しています。
WS2812Bはちょっと光量不足で,ビデオで撮ると今ひとつですが 肉眼で見るなら十分明るいしキレイですよ。

//RGBフルカラーLED WS2812B (Adafruit_NeoPixelライブラリを利用)

#include <Adafruit_NeoPixel.h>
#define PIN 1 // 出力ピンは D1
#define LED 3 // LEDは3個
Adafruit_NeoPixel pixels(LED, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
pixels.begin();
}

void loop() {
for (int i = 0; i < LED; i++) {
for (int j = 0; j <= 255; j++) {
pixels.setPixelColor( i%3, pixels.Color(255-j,0,j));
pixels.show();
pixels.setPixelColor((i+1)%3, pixels.Color(j,255-j,0));
pixels.show();
pixels.setPixelColor((i+2)%3, pixels.Color(0,j,255-j));
pixels.show();
delay(10);
}
delay(3000);
}
}

| |

2023年12月 2日 (土)

WCH-LinkE とWCH-Link は別モノである

20231202img1082
 2週間前にAliExpressで買ったプログラマ・デバッガが意外に早く中国から届いたので,さっそく先に届いていたCH32V003ボードに接続してみました。先人の教えに従って環境を整え,Arduino IDEでLチカのスケッチを書き込もうとしたら,次のようなエラーが出ました。

Error: if your chip is CH32V00X,WCH-Link-CH549 does not support this chip, please use WCH-LinkE

「どういうこと?コレ,WCH-LinkEじゃないの?」と,老眼でよく見えないから虫眼鏡を使って見てみると・・・
20231202img1083
うむ,確かに WCH-Linkと書いてあるようだが,「E」がついてるのとついてないのは何か違うのか?
WVH-LinkE の画像検索をしてみると,コレ↓ がそうらしい。
20231202wchlinke
 こっちはWCH-LinkEと書いてあるな。どっちも透明プラケースに入ったUSBドングルで そっくりだけど これはタクトスイッチが2個ついてるし(プラケースに入ってるから押せないよなあw),確かに別モノっぽい。
さらに検索したらこんな表を見つけた。
Supportedchip

 おいおい,やっぱり「E無し」の WCH-Linkは,CH32V003をサポートしてないんだ・・・。しかし,名前も見た目もソックリすぎるだろ,これ。多くの人が僕と同じ失敗をしてるんじゃないの?
くやしいけど,別のセラーに「E付き」のWCH-LinkE注文しました。また,2~3週間待たないとねw

| |

2023年12月 1日 (金)

Arduinoで作ろう(63) UNO R4 WiFiでスクロールNTP時計

 Arduino UNO R4 WiFi を手に入れました。
2773981_2
 なんと言っても目を引くのはオンボードの 12×8ドットマトリクスLEDじゃないでしょうか。あと,ESP32-S3モジュールね。なんだか夢が広がりますなあ(^^)
 pinoutはこんな感じ ↓
Abx00087pinout

 せっかくESP32モジュールとLEDマトリクスを積んでるんだから,WiFiでネット接続してNTPサーバから時刻を取得してドットマトリクスLEDでスクロールする時計を作らないとね。( また時計かw )
んで,とりあえずできました。ライブラリは新たに2つくらい入れたんだったかな。NTPClientライブラリArduinoGraphicsライブラリです。たぶん。
Shotcut_00_01_54_087

// Arduino UNO R4 WiFi スクロールNTP時計
// NTPClient library (https://github.com/arduino-libraries/NTPClient)
// ArduinoGraphics library (https://github.com/arduino-libraries/ArduinoGraphics)


#include "RTC.h"
#include "NTPClient.h"
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
#include "WiFiS3.h"
#include "WiFiUdp.h"
char ssid[] = "ここに無線LANのSSIDを書く" ;
char pass[] = "ここにパスワードを書く" ; // 
int wifiStatus = WL_IDLE_STATUS;
WiFiUDP Udp;
NTPClient timeClient(Udp);
ArduinoLEDMatrix matrix;

void printWifiStatus() {
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
}

void connectToWiFi(){
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
while (true);
}

while (wifiStatus != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
wifiStatus = WiFi.begin(ssid, pass);
delay(10000);
}

Serial.println("Connected to WiFi");
printWifiStatus();
}

void setup(){
Serial.begin(9600);
while (!Serial);

connectToWiFi();
RTC.begin();
matrix.begin();
Serial.println("\nStarting connection to server...");
timeClient.begin();
timeClient.update();
auto timeZoneOffsetHours = 9;
auto unixTime = timeClient.getEpochTime() + (timeZoneOffsetHours * 3600);
Serial.print("Unix time = ");
Serial.println(unixTime);
RTCTime timeToSet = RTCTime(unixTime);
RTC.setTime(timeToSet);
RTCTime currentTime;
RTC.getTime(currentTime);
Serial.println("The RTC was just set to: " + String(currentTime));
}

void loop(){
char buff[16] ;
const char *wd[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
RTCTime currentTime;
RTC.getTime(currentTime);
sprintf(buff, " %04u/%02u/%02u(%s) ", currentTime.getYear(), Month2int(currentTime.getMonth()), currentTime.getDayOfMonth(),wd[(int)currentTime.getDayOfWeek()]) ;
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(50);
matrix.textFont(Font_5x7);
matrix.beginText(0, 1, 0xFFFFFF);
matrix.println(buff);
matrix.endText(SCROLL_LEFT);
matrix.endDraw();

sprintf(buff, " %02u:%02u:%02u ", currentTime.getHour(), currentTime.getMinutes(), currentTime.getSeconds()) ;
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(50);
matrix.textFont(Font_5x7);
matrix.beginText(0, 1, 0xFFFFFF);
matrix.println(buff);
matrix.endText(SCROLL_LEFT);
matrix.endDraw();
}

 サンプルスケッチを参考にして,ツギハギで作ったので あんまり美しいコードではないですが,とりあえず動いてます。Arduino IDE のシリアルモニタで,無線LANアクセスポイントに接続したことを確認できるようになってます。まあ確認しなくても大丈夫ですが。

| |

2023年11月18日 (土)

Arduinoで作ろう(62) ESP8266+SSD1306でNTP時計

Esp8266ssd1306

 昨日AliExpressから届いたマイコンボードのうち,OLEDディスプレイ付きのESP8266開発ボードでNTP時計を作ってみました。
OLEDはSSD1306なので,以前も使ったことのあるこのライブラリでいきます。
SSD1306はI2Cでつながってるのですが,よくある接続とは違っててSDAがGPIO14,SCLがGPIO12につながってるので,明示的に指定してやります。あとは,以前作ったNTP時計のスケッチをちょいと書き換えたら完成です。

Cimg8446

スケッチはコレ ↓ です。

//ESP8266+SSD1306(OLED display) NTP時計

 

#include "SSD1306Wire.h" //https://github.com/ThingPulse/esp8266-oled-ssd1306
#include "ESP8266WiFi.h"
#define SDA 14 //SDA-GPIO14
#define SCL 12 //SCL-GPIO12
#define JST 3600 * 9
SSD1306Wire display(0x3c, SDA, SCL);
const char* ssid = "無線LANのSSID";
const char* password = "パスワード";

 

void setup() {
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 0, "Wi-Fi connecting..." );
display.display();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(10);
}
display.clear();
display.drawString(0, 0, "Connected to ");
display.drawString(0, 13, "SSID: " + WiFi.SSID());
display.drawString(0, 24,"IP address: " + WiFi.localIP().toString());
display.display();
configTime(JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
delay(5000);
}

 

void loop() {
display.clear();
static const char *wd[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t t = time(NULL);
struct tm *tm = localtime(&t);
char buff[16];
sprintf( buff, "%04d/%02d/%02d(%s)",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,wd[tm->tm_wday] );
display.setFont(ArialMT_Plain_16);
display.drawString(0,0,buff);
sprintf( buff, "%02d:%02d:%02d",tm->tm_hour,tm->tm_min,tm->tm_sec );
display.setFont(ArialMT_Plain_24);
display.drawString(12,24,buff);
display.display();
}

| |

2023年7月 1日 (土)

新型 Arduino UNO R4 MINIMA を買った

Cimg0708

Abx00080pinout

 2023年6月27日に発売となった新型のArduino UNO R4 MINIMA を手に入れました。秋月電子通商で3,190円。早く中華製パチもんが出回らないかな~w
旧製品R3とR4を比較するとこんな感じ。

  UNO R3 UNO R4
CPU ATmega328P(16 MHz) Renesas RA4M1(48 MHz)
SRAM 2K 32K
フラッシュメモリ 32K 256K
USB接続 Type-B Type-C

おお,大幅にスペックアップしてるじゃないですか。
とりあえず,Arduino IDEで使えるようにセットアップしてみましょう。

まずボードマネージャで UNO R4ボードを登録します。
Image1_20230701080801
「UNO R4」とかで検索すればすぐに見つかりますからインストールしましょう。

Image4_2
無事,COM3で認識されました。

 ではさっそくサンプルスケッチを試してみましょう。R4はRTCを搭載してるので これを使ってみます。(サンプルスケッチ Test_RTC)
Image5_2

シリアルモニタで見てみるとこんな具合。
Image6

夏休みはこれで遊んでみましょうかね :p

| |

より以前の記事一覧