はじめに
Raspberry Pi PicoをC/C++で開発する場合、新たにRaspberry Pi Picoの関数を覚える必要が有ります。
すでにArduinoを使いこなしている人は、delay()やdigitalWrite()なんかをPico語に置き換える度にストレスを感じるでしょう。
そこで、Raspberry Pi Picoの開発環境にArduino.hを読み込んでみました。
ここで紹介する内容はあくまで実験レベルです。
安定した動作を期待する場合はArduinoの移植プロジェクトが完了するのを待ちましょう。
https://blog.arduino.cc/2021/01/20/welcome-raspberry-pi-to-the-world-of-microcontrollers/
関連ファイル
以下に関連ファイルをアップロードしました。
https://pione.jp/qiita/Arduino_h_test.tar.gz
ダウンロード・解凍して下さい。
$wget https://pione.jp/qiita/Arduino_h_test.tar.gz
$tar -zxvf Arduino_h_test.tar.gz
$cd Arduino_h_test
$ls
Arduino.h CMakeLists.txt main.c
ArduinoFunctions.c hiddenMain.c pico_sdk_import.cmake
「main.c」がArduinoで言うところの「プロジェクト.ino」です。
「Arduino.h」は以下のファイルからコンパイル時にエラーとなる行をコメントアウトしたものです。
https://raw.githubusercontent.com/arduino/ArduinoCore-avr/master/cores/arduino/Arduino.h
主にマクロ定義を流用します。
「ArduinoFunctions.c」はArduino語の関数をPico語に置き換える独自関数です。
使用頻度の高い以下の関数を用意しました。
・void pinMode(uint8_t,uint8_t)
・void digitalWrite(uint8_t,uint8_t)
・int digitalRead(uint8_t)
・int analogRead(uint8_t)
・unsigned long millis(void)
・unsigned long micros(void)
・void delay(unsigned long)
・void delayMicroseconds(unsigned long)
他にもArduino関数を流用したい場合はこのファイルに追記します。
main.c
「main.c」ファイルを雛形として編集すればArduinoライクな開発ができます。
添付の「main.c」ファイルを見てみましょう。
# include <stdio.h>
# include <string.h>
# include "pico/stdlib.h"
# include "hardware/i2c.h"
# include "pico/binary_info.h"
# include "hardware/gpio.h"
# include "hardware/adc.h"
# include "Arduino.h"
# define LEDPin 25
# define SW 16
void setup(){
pinMode(SW,INPUT_PULLUP);
pinMode(LEDPin,OUTPUT);
}
void loop(){
if(digitalRead(SW) && millis()%1000<500){
digitalWrite(LEDPin,HIGH);
}
else{
digitalWrite(LEDPin,LOW);
}
}
GPIO16番ピン(picoの21番ピン)を開放すると1秒間隔でオンボードLEDが点滅し、GNDと短絡するとLEDが消灯するプログラムです。
setup関数とloop関数はそのままArduinoに移植できます。
応用例
「Arduino.h」をインクルードした開発環境でパルスオキシメーターを作ってみました。
https://pione.jp/products/PulseOximeter2/
プログラムについては追って解説を作成する予定です。