SSブログ

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を使ってスケッチを作成しました。

// 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 );
}


r4_sirc.jpg
お行儀がわるいですが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は光るものの、信号としては受け取ってもらえませんでした。

nice!(0)  コメント(0) 

Arduino UNO R4でLチカ、、タイマーで。 [Arduino]

Arduino UNO R4でタイマーを使ったLチカをやってみた。
blink_r4.png
まだよくわかっていないものの、とりあえず動いたという感じです。
以下のスケッチが正しいかは怪しい。

ちょっと調べてみると、、
・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

nice!(0)  コメント(0) 

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_r4.png
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

タグ:Lチカ Tone Uno R4
nice!(0)  コメント(0) 

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チカです。
blink_r4.png
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




タグ:Uno R4 Lチカ PwM
nice!(0)  コメント(0) 

Arduino IDE 2.0.0 アンインストールできない事件 [Arduino]

いまさらだけど、Arduino Uno R4 Minima をぽちってみた。
Uno R4 じゃないと出来ない事がしたいわけでもない。
いままでのArduinoに困っているわけでもない。
ただ何となくマイコンがルネサス製で同じ日本というよしみで購入。

ideicon.png
megaTinyCoreが「IDE 2.0.x unsupported」ということで以前に入れた IDE 2.0.0はほとんど使っていなかった。
Arduino Uno R4 Minima を購入にあたり、まだ届かないけど、とりあえずIDEを新しくしようとして問題がおこる。
でも先人がすでに解決済であった。

問題:Arduino IDE 2.0.0がアンインストールできない。
Arduino IDEを起動していないのに、「Arduino IDEが終了できません。」と出る。
ide200uninst.png
解決法:
Arduino IDE 2.0.0 のインストールされているフォルダーに行く
  デスクトップやメニューにある「Arduino IDE」ショートカットを右クリックして「ファイルの場所を開く」
  あるいは 「%localappdata%\Programs\Arduino IDE」を直接開く。
「Arduino IDE.exe」を「Arduino IDE2.exe」などに変更する。

ide200uninst_ren.png

アンインストール完了!
ide200uninst_ok.png

あとは、IDE 2.1.1をダウンロードして、インストール。

idedonate.png
(ブログに載せるにあたり、ちょっと寄付)
nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。