Arduino UNO R4でリモコン [Arduino]
低機能マイコンでできたことを高機能のUNO R4でやっても面白味はないのですが、実験ということで。
202duino でPWMを使ってリモコン送信
https://hello-world.blog.ss-blog.jp/2023-06-01
ATtiny202では、レジスタをいじって40kHz PWMを作りましたが、UNO R4ではレジスタの設定不要で、pwm.hを使ってスケッチを作成しました。
お行儀がわるいですがLEDは直刺し。
UNO R4 Minima Arduino Documentation
https://docs.arduino.cc/hardware/uno-r4-minima
ここに、「Maximum current draw per pin: the UNO R4 series' maximum current draw per GPIO is 8 mA, which is significantly lower than previous versions. Exceeding this limit may damage your pin / board.」とありました。(UNO R3 は 20mA)。パルスだしいいかな?と(何が?)
ちなみに tone() でも試してみましたが、動作しませんでした。
LEDは光るものの、信号としては受け取ってもらえませんでした。
202duino でPWMを使ってリモコン送信
https://hello-world.blog.ss-blog.jp/2023-06-01
ATtiny202では、レジスタをいじって40kHz PWMを作りましたが、UNO R4ではレジスタの設定不要で、pwm.hを使ってスケッチを作成しました。
// Infrared remote control with 40kHz PWM (SIRC version)
#include <pwm.h>
static PwmOut ir( 12 ); // IR LED pin
void setup() {
}
void loop() {
sendIrSIRCpwm( 46 | 1UL << 7 ); // SONY TV ON (cmd:46(7bit), adrs:1(5bit))
sendIrSIRCpwm( 46 | 1UL << 7 ); // repeat 3 times
sendIrSIRCpwm( 46 | 1UL << 7 );
delay( 5000 );
sendIrSIRCpwm( 47 | 1UL << 7 ); // SONY TV OFF (cmd:47(7bit), adrs:1(5bit))
sendIrSIRCpwm( 47 | 1UL << 7 ); // repeat 3 times
sendIrSIRCpwm( 47 | 1UL << 7 );
delay( 5000 );
}
void sendIrSIRCpwm( uint32_t d ) { // T = 0.60msec
uint8_t b = (d & 0xF8000) ? 20 :
(d & 0x07000) ? 15 : 12; // number of bits
uint16_t usON, usTrailer = 420; // 70T = interval(75T) - leader(5T)
ir.begin( 25, 8); delayMicroseconds( 2400 ); // leader ON (4T) 40kHz = every 25usec
ir.suspend(); delayMicroseconds( 600 ); // leader OFF (1T)
for(uint8_t i = 0; i < b; i++) { // data(command + address)
usON = ((d>>i)&1) ? 1200 : 600; // data(0:1T / 1:2T)
ir.resume(); delayMicroseconds( usON ); // data ON
ir.suspend(); delayMicroseconds( 600 ); // data OFF (1T)
usTrailer -= (usON + 600); // trailer
}
ir.end();
delayMicroseconds( usTrailer );
}
お行儀がわるいですがLEDは直刺し。
UNO R4 Minima Arduino Documentation
https://docs.arduino.cc/hardware/uno-r4-minima
ここに、「Maximum current draw per pin: the UNO R4 series' maximum current draw per GPIO is 8 mA, which is significantly lower than previous versions. Exceeding this limit may damage your pin / board.」とありました。(UNO R3 は 20mA)。パルスだしいいかな?と(何が?)
ちなみに tone() でも試してみましたが、動作しませんでした。
LEDは光るものの、信号としては受け取ってもらえませんでした。
Arduino UNO R4でLチカ、、タイマーで。 [Arduino]
Arduino UNO R4でタイマーを使ったLチカをやってみた。
まだよくわかっていないものの、とりあえず動いたという感じです。
以下のスケッチが正しいかは怪しい。
ちょっと調べてみると、、
・AVRのようにレジスタを直接いじるのはちょっと難しそう
・FspTimerというのを使うといいっぽい
・FSPとは Flexible Software Package のことらしい
・2種類のタイマー GPT (General PWM Timer)、AGT(Asynchronous General Purpose Timer)がある
・AGTタイマーは2つだけで、1つ(channel 0)は millis()、microseconds()に使用済
・get_available_timer で使用可能なタイマーのタイプとチャンネルを取得(GPTから先に探している)
FspTimerについて詳しく調べられた方のページ:
Arduino UNO R4のFspTimerライブラリの使い方 - Qiita
https://qiita.com/yasuhiro-k/items/93efb640aa12f3db9086
これをもとに作ってみた。
2.0Hz(=500msec毎)でLEDのON/OFFを切り替えます。
周波数の指定はfloat型だけど1Hz未満では動作しなかった。
タイマーはGPTから先に空きを調べていくのでGPTを使用していると思われる。
つづいてもう一つ。
AGTをライブラリに仕上げられた方のページ:
GitHub - washiyamagiken/AGTimer_R4_Library
https://github.com/washiyamagiken/AGTimer_R4_Library
これをもとにライブラリをLチカ専用に展開。AGTのチャンネル1を使用。
TIMER_SOURCE_DIV_64 のとき、period countsが 32768 だと1Hz、16384だと2Hz (500msec毎)。
<FSPタイマー関連プログラムの在処>
%localAppdata%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.h
%localAppdata%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.cpp
まだよくわかっていないものの、とりあえず動いたという感じです。
以下のスケッチが正しいかは怪しい。
ちょっと調べてみると、、
・AVRのようにレジスタを直接いじるのはちょっと難しそう
・FspTimerというのを使うといいっぽい
・FSPとは Flexible Software Package のことらしい
・2種類のタイマー GPT (General PWM Timer)、AGT(Asynchronous General Purpose Timer)がある
・AGTタイマーは2つだけで、1つ(channel 0)は millis()、microseconds()に使用済
・get_available_timer で使用可能なタイマーのタイプとチャンネルを取得(GPTから先に探している)
FspTimerについて詳しく調べられた方のページ:
Arduino UNO R4のFspTimerライブラリの使い方 - Qiita
https://qiita.com/yasuhiro-k/items/93efb640aa12f3db9086
これをもとに作ってみた。
2.0Hz(=500msec毎)でLEDのON/OFFを切り替えます。
周波数の指定はfloat型だけど1Hz未満では動作しなかった。
タイマーはGPTから先に空きを調べていくのでGPTを使用していると思われる。
#include <FspTimer.h>
static FspTimer fsp_timer;
void blinkLED(timer_callback_args_t __attribute((unused)) *p_args) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
uint8_t timer_type;
int8_t timer_ch = FspTimer::get_available_timer(timer_type);
if (timer_ch < 0) return;
fsp_timer.begin( TIMER_MODE_PERIODIC, timer_type, timer_ch, 2.0f, 0.0f, blinkLED, nullptr );
fsp_timer.setup_overflow_irq();
fsp_timer.open();
fsp_timer.start();
}
void loop() {
}
つづいてもう一つ。
AGTをライブラリに仕上げられた方のページ:
GitHub - washiyamagiken/AGTimer_R4_Library
https://github.com/washiyamagiken/AGTimer_R4_Library
これをもとにライブラリをLチカ専用に展開。AGTのチャンネル1を使用。
TIMER_SOURCE_DIV_64 のとき、period countsが 32768 だと1Hz、16384だと2Hz (500msec毎)。
#include <FspTimer.h>
static FspTimer fsp_timer;
void blinkLED(timer_callback_args_t __attribute((unused)) *p_args) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
fsp_timer.begin( TIMER_MODE_PERIODIC, AGT_TIMER, 1, 16384, 0, TIMER_SOURCE_DIV_64, blinkLED, nullptr );
IRQManager::getInstance().addPeripheral( IRQ_AGT, (void*)fsp_timer.get_cfg() );
fsp_timer.open();
fsp_timer.start();
}
void loop() {
}
<FSPタイマー関連プログラムの在処>
%localAppdata%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.h
%localAppdata%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.cpp
Arduino UNO R4でLチカ、、tone()で。 [Arduino]
もっと簡単にLチカできる方法!
tone関数を使えば実質1行だけ。
tone() - Arduino Reference
https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/
・「It is not possible to generate tones lower than 31Hz.」とあったが、UNO R4では1Hzもいけた。
・周波数は整数型(unsigned int)なので1Hzよりゆっくりにはできない。
・duty比を指定できない。
Blink LED with tone function.
<tone()関係プログラムの在処>
%LocalAppData%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\Tone.cpp
tone関数を使えば実質1行だけ。
tone() - Arduino Reference
https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/
・「It is not possible to generate tones lower than 31Hz.」とあったが、UNO R4では1Hzもいけた。
・周波数は整数型(unsigned int)なので1Hzよりゆっくりにはできない。
・duty比を指定できない。
Blink LED with tone function.
void setup() {
tone(LED_BUILTIN, 1); // 1Hz : toggle ON and OFF every 500ms
}
void loop() {
}
<tone()関係プログラムの在処>
%LocalAppData%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\Tone.cpp
Arduino UNO R4でLチカ、、PWMで。 [Arduino]
Arduino UNO R4やっと届きました。
LEDマトリックスとかWi-Fiとか(自分の能力的にも気力的にも)使いこなせそうにないのでMinimaです。
特別やりたいことはないので、とりあえずLチカ。
Arduino IDE 2.1.1をインストールしたものの、Arduino 1.8.19でも「ボードマネージャ」から「UNO R4」で検索すると、「Arduino UNO R4 Boards」というのが出てくるので、インストール。
しばらく、Arduino 1.8.19 で行けそう。
やってみたのがこれ。500msecごとにON/OFFを繰り返す、1HzのLチカです。
UNO R4は、PWMをいじれるようなので、それでLチカできました。
参考:
Under the Hood Arduino UNO R4 - PWM - Phil Schatzmann
https://www.pschatzmann.ch/home/2023/07/01/under-the-hood-arduino-uno-r4-pwm/
別件ですが、上記の方のサイトでエレガントなLチカのスケッチを見つけた。
How to Blink in Arduino - Alternative Designs - Phil Schatzmann
https://www.pschatzmann.ch/home/2020/09/10/arduino-blinking-sketch/
<PWM関係プログラムの在処>
%LocalAppData%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\pwm.h
%LocalAppData%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\pwm.cpp
LEDマトリックスとかWi-Fiとか(自分の能力的にも気力的にも)使いこなせそうにないのでMinimaです。
特別やりたいことはないので、とりあえずLチカ。
Arduino IDE 2.1.1をインストールしたものの、Arduino 1.8.19でも「ボードマネージャ」から「UNO R4」で検索すると、「Arduino UNO R4 Boards」というのが出てくるので、インストール。
しばらく、Arduino 1.8.19 で行けそう。
やってみたのがこれ。500msecごとにON/OFFを繰り返す、1HzのLチカです。
UNO R4は、PWMをいじれるようなので、それでLチカできました。
#include <pwm.h>
static PwmOut pwm(LED_BUILTIN);
void setup() {
pwm.begin( 1000000, 500000); // period 1000000us(1Hz), pulse 500000us
}
void loop() {
}
または、
#include <pwm.h>
static PwmOut pwm(LED_BUILTIN);
void setup() {
pwm.begin( 46875, 23437, true, TIMER_SOURCE_DIV_1024 ); // 48MHz/1024clk=46875(1Hz)
}
void loop() {
}
参考:
Under the Hood Arduino UNO R4 - PWM - Phil Schatzmann
https://www.pschatzmann.ch/home/2023/07/01/under-the-hood-arduino-uno-r4-pwm/
別件ですが、上記の方のサイトでエレガントなLチカのスケッチを見つけた。
How to Blink in Arduino - Alternative Designs - Phil Schatzmann
https://www.pschatzmann.ch/home/2020/09/10/arduino-blinking-sketch/
<PWM関係プログラムの在処>
%LocalAppData%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\pwm.h
%LocalAppData%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\pwm.cpp
Arduino UNO R4 Minima [ABX00080] - Renesas RA4M1 - USB-C、CAN、DAC(12ビット)、OP AMP、SWDコネクタ
- 出版社/メーカー: Arduino
- メディア:
Arduino IDE 2.0.0 アンインストールできない事件 [Arduino]
いまさらだけど、Arduino Uno R4 Minima をぽちってみた。
Uno R4 じゃないと出来ない事がしたいわけでもない。
いままでのArduinoに困っているわけでもない。
ただ何となくマイコンがルネサス製で同じ日本というよしみで購入。
megaTinyCoreが「IDE 2.0.x unsupported」ということで以前に入れた IDE 2.0.0はほとんど使っていなかった。
Arduino Uno R4 Minima を購入にあたり、まだ届かないけど、とりあえずIDEを新しくしようとして問題がおこる。
でも先人がすでに解決済であった。
問題:Arduino IDE 2.0.0がアンインストールできない。
Arduino IDEを起動していないのに、「Arduino IDEが終了できません。」と出る。
解決法:
Arduino IDE 2.0.0 のインストールされているフォルダーに行く
デスクトップやメニューにある「Arduino IDE」ショートカットを右クリックして「ファイルの場所を開く」
あるいは 「%localappdata%\Programs\Arduino IDE」を直接開く。
「Arduino IDE.exe」を「Arduino IDE2.exe」などに変更する。
アンインストール完了!
あとは、IDE 2.1.1をダウンロードして、インストール。
(ブログに載せるにあたり、ちょっと寄付)
Uno R4 じゃないと出来ない事がしたいわけでもない。
いままでのArduinoに困っているわけでもない。
ただ何となくマイコンがルネサス製で同じ日本というよしみで購入。
megaTinyCoreが「IDE 2.0.x unsupported」ということで以前に入れた IDE 2.0.0はほとんど使っていなかった。
Arduino Uno R4 Minima を購入にあたり、まだ届かないけど、とりあえずIDEを新しくしようとして問題がおこる。
でも先人がすでに解決済であった。
問題:Arduino IDE 2.0.0がアンインストールできない。
Arduino IDEを起動していないのに、「Arduino IDEが終了できません。」と出る。
解決法:
Arduino IDE 2.0.0 のインストールされているフォルダーに行く
デスクトップやメニューにある「Arduino IDE」ショートカットを右クリックして「ファイルの場所を開く」
あるいは 「%localappdata%\Programs\Arduino IDE」を直接開く。
「Arduino IDE.exe」を「Arduino IDE2.exe」などに変更する。
アンインストール完了!
あとは、IDE 2.1.1をダウンロードして、インストール。
(ブログに載せるにあたり、ちょっと寄付)