DaVinciで外部割込み4本
自律飛行体の安全対策としてR/C操縦に切り替えられるようにすると、Arduinoの標準ライブラリだけでは非力なので工夫がいります。
R/Cの受信機のパルス幅を読むのにpulseIn関数がよく使われるのですが、パルスを待ってる間(最高20msくらい)は他のことができないので、4チャンネル分パルスを読もうとすると結構な待ち時間(下手すると80ms?)が入り、サーボやアンプがばたついてしまって飛行体が不安定になってしまいます。
外部割込みを使って信号が変化した時だけパルスを読むようにすれば不要な待ち時間が省けるのですが、通常は0,1の2本しか割込みがなく(Arduino Megaで6本)、4チャンネル分のR/C受信機を監視できませんでした。
Da vinci 32U は使いやすそうだし、PCをとの通信にマイコンのシリアル端子を使わなくていいので、割込みを4本に増やせないかと思ってチャレンジしてみました。
まず、
arduino-1.0.1\hardware\arduino\boards.txt
を確認すると、
davinci.build.core=arduinodavinci.build.variant=leonardo
とあり、leonardoと互換らしい。
次に、
arduino-1.0.1\hardware\arduino\cores\arduino\WInterrupts.c
の中の、
#if defined(__AVR_ATmega32U4__)
の case 0, case 1 が割込み0,1 の場合なので、同じように、
case 2:
case 3:
を追記。更に、その下の方で、
#if defined(__AVR_ATmega32U4__) ・・・ SIGNAL(INT2_vect) { if(intFunc[EXTERNAL_INT_2]) intFunc[EXTERNAL_INT_2](); } SIGNAL(INT3_vect) { if(intFunc[EXTERNAL_INT_3]) intFunc[EXTERNAL_INT_3](); }を追記した。最後に、
C:\Program Files\arduino-1.0.1\hardware\arduino\cores\arduino\wiring_private.h
の中でEXTERNAL_NUM_INTERRUPTSの数を書き換え。
・・・ #else #define EXTERNAL_NUM_INTERRUPTS 4 // <- 元は2 #endif
以上で、簡単なスケッチを書いて割込み2,3の動作を確認。
上手く行ったっぽいです。
int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(2, blink, CHANGE); // ここで 2,3と変えて動作確認 } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
確認作業中の写真↓
ESP32 Wifi Bluetooth開発ボード |
Arduino Nano Every |
Raspberry Pi pico |
FPGA XILINX Artix-7 |