ラズパイ・ピコ

2022年5月 2日 (月)

マイコン出力ポートのプルアップ、プルダウン問題 誤パルス出力を避けるために

トランジスタ技術2004年1月号に
  『マイコン内蔵I/Oポートによる各種ドライブ回路』
という題で、入出力ポートに対する注意点を載せてもらい
ました。
Tt1_20220502131301
「定番エレクトロニクス回路140」という特集記事で、
小さな記事がいくつもならんでいます。
Tt2_20220502131301

その中の一つで、掲載記事は1ページにまとまっています。
Tt31

出力が不定な、プログラムが走る前のリセット期間に
要注意という内容です。
インターフェースするデバイスにより、プルダウン抵抗
を付けたり、プルアップ抵抗を使ったりということで、
あれこれ解説しています。
あらためて図示しておきます。

まず「Hアクティブ」で使う信号考えます。
Pp01
ポートを直で使うのではなく、
  ・駆動電流を増やしたい
  ・異電圧でドライブしたい
など、インターフェース素子を間にはさむ場合が出てきます。
  ※例では LEDを負荷にしました。

これはアカンぞ! という例。
Pp02
ベースやゲートなどの入力インピーダンスを下げておかないと
誘導や隣の信号のパルスを拾ってしまって
「誤作動するかも」です。

「勝手な出力が出てもOKだよ」という回路じゃ限り
面倒でも抵抗を入れておきましょう。
Pp03
これで、まっとうな「Hアクティブ出力」になります。
バイポーラトランジスタだと「抵抗内蔵トランジシタ=デジトラ」が
使えます。

多信号なら、トランジスタアレイを使いましょう。
Pp04
入力を安定させる抵抗が入っています。

問題は「Lアクティブ」信号。
昔からある「TTL」は
  入力オープンだとHと認識。
  Lに引っ張って(GNDに電流を流して)オン。
  入力を安定させるにはプルアップ抵抗を。
  ストローブ信号など、Lアクティブが多い。
という特徴があります。
Pp11
TTLでインターフェースするなど、Lアクティブで使う時は
プルアップ抵抗を入れるのが定石になります。
しかし、マイコンのポートを初期化する時にこつが必要です。
 ・ポートの出力レジスタを先にHに。
 ・その後からポートを出力モードに。
「先にH」を処置せず、出力モードにしてからHを出力すると、
一瞬のLパルスが出てしまいます。
  ※このパルスが無視できる回路なら良いのですが

この処置、昔のI/Oチップ「8255」などは
  「出力に初期化したらポートはLからスタート」
となっていて、Lアクティブで使うには、不要なLパルスが出ても
大丈夫な回路を構築しておかなくてはなりませんでした。

LEDの点灯回路ならこんな具合です。
Pp13

間違って「Hアクティブ」で使う回路にプルアップ抵抗を
入れてしまうと、
  電源オン→リセット解除→プログラムが走り始める
この間、不要なパルスが出てしまいます。

TTLだから入力をプルアップしたのにHアクティブで使う、
というのはちょっとなぁです。
出てくる余計な信号が悪さをしなければ良いのですが。
Pp12
LEDだと「一瞬光る」だけで済むのですが、メカを駆動する
ような回路だと、問題が生じるかもしれません。

Raspberry Pi PicoのマイコンRP2040、
「リセットで内蔵プルダウン抵抗が有効になる」は、
  ・入力がオープンのまま放置されるのを防止
  ・Hアクティブ出力での不要パルスの防止
この二つの役目があります。

Pp05  
しかし、RP2040を「Lアクティブ出力」で使う時は要注意になります。
内蔵プルダウン抵抗に負けない(抵抗値の小さな)プルアップ抵抗を
使っておかないと、リセットで不要なパルス(L出力)が出てしまいます。

| | コメント (1)

2022年5月 1日 (日)

Raspberry Pi Pico リセット起動後のポートはプルダウン抵抗が有効に

まだまだ使いこなせていないRaspberry Pi Picoですが、
ラジオペンチさんところの
Raspberry Pi Picoで72LEDのクリスマスツリーイルミネーションを作る
この記事にコメントした関係で、PicoのI/Oポートについて
あれこれ調べてみました。

参考資料はこれ。
P11_20220501113801

I/Oポートの構成図、こんなのが記されています。
P12_20220501113801

その機能、ポート1ビットごと独立して設定できるように
なっています。
P21
P22

リセット後はこんな状態になります。
 ・出力は禁止。 入力ポートに。
 ・出力ドライブ能力は4mAに。
   (4種類あってmaxは12mA)
 ・プルアップ抵抗はなし。
 ・プルダウン抵抗が有効に。★
 ・入力のシュミットトリガー機能は有効。
 ・出力Slew rateはSlowに。
となっています。

Arduino UNOのAtmega328Pなどと異なるのが★の
プルダウン抵抗有効」という機能です。
これで「未使用ポート」の処理を省けます。

Arduino IDE下でスケッチを組んだ時、入出力を
決めるのに「pinMode()」を使います。
どんな処理がされているのか探しますと、
  ※wiring_digital.cppの中
~~~~~~~~~~~~~~~~~~~~~~~~~
void pinMode(pin_size_t ulPin, PinMode ulMode) {
 switch (ulMode) {
  case INPUT:
    gpio_init(ulPin);
    gpio_set_dir(ulPin, false);
    gpio_disable_pulls(ulPin);
    break;
  case INPUT_PULLUP:
    gpio_init(ulPin);
    gpio_set_dir(ulPin, false);
    gpio_pull_up(ulPin);
    gpio_put(ulPin, 0);
    break;
  case INPUT_PULLDOWN:
    gpio_init(ulPin);
    gpio_set_dir(ulPin, false);
    gpio_pull_down(ulPin);
    gpio_put(ulPin, 1);
    break;
  case OUTPUT:
    gpio_init(ulPin);
    gpio_set_dir(ulPin, true);
    break;
  default:
    DEBUGCORE("ERROR: Illegal pinMode mode (%d)\n", ulMode);
    return;
 }
 if (ulPin > 29) {
    DEBUGCORE("ERROR: Illegal pin in pinMode (%d)\n", ulPin);
    return;
 }
 _pm[ulPin] = ulMode;
}
~~~~~~~~~~~~~~~~~~~~~~~~~

gpio_disable_pulls();」という関数で、
「プルアップ抵抗、プルダウン抵抗、両方ともなし」を
設定しています。
全ポート一括して処理するという関数は用意されていない
ようです。


もう一つ。
gpio_init() 」の中味。
~~~~~~~~~~~~~~~~~~~~~~~~~
void gpio_init(uint gpio) {
  sio_hw->gpio_oe_clr = 1ul << gpio;
  sio_hw->gpio_clr = 1ul << gpio;
  gpio_set_function(gpio, GPIO_FUNC_SIO);
}

void gpio_init_mask(uint gpio_mask) {
  for(uint i=0;i<32;i++) {
    if (gpio_mask & 1) {
      gpio_init(i);
    }
    gpio_mask >>= 1;
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~
指定ピンを「GPIO_FUNC_SIO」にということで。

  ※SIOシリアルI/Oじゃなく、
   シングルサイクルI/Oのこと。
   ちょいと違和感がぁ。

 

| | コメント (2)

2022年4月20日 (水)

Arduino IDEでRaspberry Pi Pico:シリアル受信バッファを増やす

「rp2040・1.13.1」内の「docs」「serial.rst」ファイルを
見ますと、
 Serial1.setFIFOSize(128);
 Serial1.begin(baud);
というサンプルが記されていて、setFIFOSizeでバッファを
増やして、受信時の文字抜けを防げるぞとなっています。

Pi Picoの初期設定ではFIFOの32文字
それを指定しただけ増やせるということなのです。
それを確かめてみました。
  ※Arduino-UNOだと、「HardwareSerial.h」の中で
   送受それぞれに64バイトずつ確保されています。

こんなスケッチを書いてみました。
setFIFOSizeでバッファを128文字に。
・1ms周期で受信文字を取り出す。
・順に文字バッファに保存。
・CRが来たらそれをシリアル出力。
・動作確認のためパルス出力。
   P2:1ms周期の受信文字取り出しタイミング
   P3:シリアル出力タイミング
   P4:loopでパルスをトグル
・Serial1:UART0を115200BPSで
・別のマイコンから1秒周期でシリアルデータ
 (71文字+CR+LF)を送り込んで抜けがないかを
 確認。 (71文字に意味はなし たまたま)

オシロで見るとこんな波形。
F000_20220420163701

まず、ドバッとかたまりで受信データがやってきます。
それをゆっくりと1ms周期で読み出しています。
初期設定のまま(FIFOの32文字だけ)だったり、
割り込み処理がうまく行ってないと、バッファが
あふれて文字抜けが発生します。
タイミングにより「CR」を見つけることができなければ
受信後の処理ができなくなってしまいます。
そんなことなく、うまく処理が進みました。

もう少し波形を拡大すると、受信割り込み処理に
時間が取られて、loopパルスが広がっているところが
見えてきます。

F001

しかし・・・
残念なことにシリアル送信側のバッファ容量は
増えていません。
32文字のFIFOのままです。
F004

ですので、「送出文字数 - 32文字」を出し終わる
までの待ち時間が発生します。
Arduino UNOだと、これが64文字なんですよね。
これ、なんとかしたいなぁ。

//  Raspberry Pi PicoのSerial1.setFIFOSizeを確かめる
// 文字バッファ
#define STRBF_SIZ 256 // 文字バッファサイズ
char str_bff[STRBF_SIZ + 1]; // 文字列(null含む)
word str_cnt; // 受信文字数

/***** SETUP *****/
void setup() {
Serial1.setFIFOSize(128); // FIFO
Serial1.begin(115200); // UART0
pinMode(2, OUTPUT); // P2 受信処理中H
pinMode(3, OUTPUT); // P3 送信タイミングでH
pinMode(4, OUTPUT); // P4 loopでトグル
pinMode(LED_BUILTIN, OUTPUT); // LED
}

/***** LOOP *****/
void loop() {
byte f_xLED = 0; // LED点滅用
char c;
uint32_t t, tn; // us計時
tn = micros(); // 開始時
while(1){
f_xLED ^= 1; // LED トグル
gpio_put(LED_BUILTIN, f_xLED);
gpio_put(4, f_xLED); // P4もトグル
t = micros() - tn; // 経過us
if(t >= 1000){ // 1ms経過
tn = micros(); // 現在時
if(Serial1.available()){ // 受信データあり
gpio_put(2, HIGH); // P2 H
c = Serial1.read(); // 1文字読み出し
if(c == '\r'){ // CR?
str_bff[str_cnt] = '\0'; // nullを最後に
gpio_put(3, HIGH); // P3 H
Serial1.print(str_bff); // 受信文字列1行送信
gpio_put(3, LOW); // P3 L
sprintf(str_bff, " (%3dchr)", str_cnt);
Serial1.println(str_bff); // 受信文字数
str_cnt = 0; // 文字数ゼロに
}
else{ // CR以外の文字
if((str_cnt < STRBF_SIZ) && // バッファサイズ内
(isprint(c))){ // 表示可能文字0x20~0x7E
str_bff[str_cnt] = c; // バッファに保存
str_cnt++; // 1文字進める
}
}
}
gpio_put(2, LOW); // P2 L
}
}
}

 

| | コメント (0)

2022年4月19日 (火)

Arduino IDEでRaspberry Pi Pico:millisをwordで処理した時の異常

2022年4月14日:Arduino IDEでRaspberry Pi Pico:32bitマイコンがバグを生む
この検証用スケッチを書いてみました。

/*****  millisを使った時間待ち  *****/
// uint32_tではなくwordで
word ms_0;
word ms_1;
void delay2(word dly)
{
ms_0 = (word)millis(); // 開始値
while(1){
digitalWrite(2, HIGH); // テスト用パルス出力
ms_1 = (word)millis(); // 現在値
if((ms_1 - ms_0) >= dly) break; // ★1 時間経過
// if((word)(ms_1 - ms_0) >= dly) break; // ★2
digitalWrite(2, LOW);
}
}

/***** SETUP *****/
void setup() {
Serial.begin(9600); // TX
pinMode(2, OUTPUT); // PD2
pinMode(3, OUTPUT); // PD3
pinMode(LED_BUILTIN, OUTPUT); // LED
}

/***** LOOP *****/
void loop() {
byte f_xLED = 0; // LED点滅用
word cnt = 0; // loopカウンタ
char tx_bff[64]; // 送信文字列
while(1){
f_xLED ^= 1; // LED トグル
digitalWrite(LED_BUILTIN, f_xLED);
delay2(1000); // 1000ms wait
sprintf(tx_bff, "#%4d %5u %5u",
cnt, ms_1, ms_0);
Serial.println(tx_bff); // 改行
cnt++;
if(cnt > 9999) cnt = 0;
}
}

★1 と ★2の違いが重要。
★2は引き算結果を(word)でキャストしています。

Arduino UNOで動いていた<★1>の処理、
これをRaspberry Pi Picoに持ってくると、
  cnt ms_1 ms_0
 # 61 62002 61002
 # 62 63002 62002
 # 63 64002 63002
 # 64 65002 64002 ←ここまで動いて停止

数値の比較ができず(32bitのマイナス値になる)、
時間待ち関数から抜け出せません。

これを<★2>のようにすると、Pi PicoでもArduino UNO
でもオーバーフロー発生部分を無事に通過できます。
こんな具合。
  cnt ms_1 ms_0
 # 63 64002 63002
 # 64 65002 64002 ←ここで止まっていたのが、
 # 65   466 65002  (65536+466=66002) 通過
 # 66  1466  466
 # 67  2466 1466
 # 68  3466 2466

符号なし16bit値同士の減算、オーバーフローが起こっても
16bitならうまく「差」が算出されます。
「466 - 65002」は16進だと「01D2 - FDEA」。
「01D2 - FDEA = FFFF・03E8」となり、不要な上位の
「FFFF」は捨てられて下位の16bit値、「03E8」が出てきます。
16進の03E8は10進で1000。
ちゃんと1000ms待ちが動きます。

それが32bitマイコンだと「暗黙の型変換と符号拡張」 が悪さをして、
「01D2 - FDEA = FFFF・03E8 = -64536」とマイナスの値になって
しまいます。
  ※符号なし16bit = word = uint16_t で比較されるつもりが
   符号付の long = int32_t (32bitマイコンでは int だ) で
   比較が行われるのです。
結果、1000msの経過がチェックできません。
今回の例では、減算値ms_0は65002と固定されています。
ms_1が0~65535の間を変化しても、1000を越える値は出てきません
いつまでたってもこのdelayルーチンから抜け出せないのです。

このスカタンの場合、65秒ほど経てば「あれ? なんかおかしい
と気が付くわけですが、もっと複雑な処理で、異常の出現まで
時間がかかるような場合や、条件が重なった時だけ発生する
ものだと、むちゃ怖いバグになってしまいます。

8bitマイコンで正しく動いていたルーチンを32bitマイコンに
持ってくると、転けてしまって動かない。
よく考えておかないと、こんなことが現実に起こります。
「暗黙の型変換と符号拡張」 、昔のルーチンを借用する時は
どうぞ気をつけてください。

| | コメント (0)

2022年4月18日 (月)

Arduino IDEでRaspberry Pi Pico:BSch3V部品ライブラリ

「Raspberry Pi Pico」のBSch3V部品ライブラリ をアップしておきます。
Rr1

ピン番号だけだと面白くないので、USBコネクタなど、
外形を模擬しています。

※21ピンの信号名を修正しました。 (2022-04-27)
P11_20220427104101
「ピコ」の場所は「SPECIAL.LB3」の一番最後。
  ・ダウンロード - special.zip   圧縮しています。

| | コメント (2)

Arduino IDEでRaspberry Pi Pico:ピンヘッダが便利かソケットが便利か

Raspberry Pi Picoへ取り付けるコネクタ、
・ブレッドボードに乗せるのならオスのピンヘッダを下向きにハンダづけ。
 この時使うのは秋月電子の
   細ピンヘッダ 1x40(黒)
 対応するソケットは
   分割ロングピンソケット(細ピン用)1x40(40P)

・Arduino-UNOのように必要な信号線だけをちょこっと
 引き出して使うのなら、メスソケットを上向きにハンダ付け。
 その時はこれ。
   分割ロングピンソケット 1x42(42P)
 対応するピンヘッダはこれ。
   ピンヘッダ 1x40(40P)

手元に2つあるRaspberry Pi Pico、ピンヘッダにした
ものとソケットにしたもの、それぞれを作っています。
Aa11_20220418100901

リセットスイッチ(RUN・GND間)は、
   タクトスイッチ(白)(10個入)
2本足のこれを。
  (通常の4本足のは使いにくいかと)

| | コメント (0)

2022年4月15日 (金)

Arduino IDEでRaspberry Pi Pico:A/D入力が…あれっ?

Arduino IDEでRaspberry Pi Pico:PWMでD/A出力してA/D入力を試す
この続きになるのですが、オペアンプとPicoのA/D入力の間に入れた
CRフィルタ。
これがどうもおかしな挙動をするのです。

Pwm_ad31

まず、コンデンサ無しで抵抗だけで。
抵抗値を変えて様子を見ます。
R12-2

抵抗値を大きくすると電圧ドロップが発生して
読み出したA/D値が低下します。
3.3kΩになると「もうアカンでぇ」という感じ。

そこにコンデンサ(仮に0.1uFの積セラ)を入れてみたの
がこれ。
R12-1
瞬時的なA/Dのサンプル電流をコンデンサが吸収してくれる
のでしょう、ドロップが改善されます。
直列抵抗を100kΩにしても抵抗だけのようなドロップは
生じません。

しかし・・・
「100Ω+0.1uF」だと、100Ωの抵抗だけの時は
直結と変わらなかったのに、入力電圧が上がったところ、
Vrefの1/2を越えたところあたりからおかしなドロップ
が生じます。

この挙動は、いったい何なんでしょうね。


※積セラをフィルムコンに変えてもほぼ同じでした。
  (100Ωだけで試して)
Cap103
直結と100Ωだけは同じグラフが出てきますが、
0.1uFを入れるとアレレに。

| | コメント (1)

2022年4月14日 (木)

Arduino IDEでRaspberry Pi Pico:32bitマイコンがバグを生む

Arduino UNOの「int」は16ビット
それがRaspberry Pi Picoになると「int」は32ビットに

Arduino UNOだとついついRAMをケチりたく
なって、255までの数値でOKなら「byte」でと
「スケッチ」を書いてしまいます。
8ビットで済むところをwordやintにするのは
もったいない・・・ はい。ケチです。

そんな考えで作ったプログラムをPicoに持って
くると思わぬ「バグ」が生じます。
  ・Arduino IDEでRaspberry Pi Pico:PWMでD/A出力してA/D入力を試す

このスケッチ中で使っている時間待ちルーチン。
bkdelay」という名で、1ms単位の時間待ちをしている途中、
シリアル入力があったら時間待ちを中断するという機能を
持たせています。
1秒待ちなんかしてる時に、「もぅエエからはよ終わろうぜ
に対処します。

さて、この時間待ち。
割り込みを使わずに管理するとなると、millisを呼び出して
時間経過をチェックするという処理になります。

millisは32bit値で最大1193時間、50日ほどを計時できます。
「そんな長いこと待たへんのんで16bitでエエやん」と
ケチるわけです。  (16bitだと65秒)
その「ケチな考え」が32bit CPUでバグを生んでしまいます。

今回のルーチン。
/***** Break処理付のdelay *****/
// シリアル受信あればdelayを中断
void bkdelay(word dly)
{
word tn, t;
  tn = (word)millis();    // now
  while(1){
   t = (word)millis();    // 経過
   if((word)(t - tn) >= dly) break;
   if(Serial.available())  break; // 受信データ
  }
}

目標待ち時間dlyと経過時間(t - tn)を比較している
んですが、すべて16bit値で計算していました。
  ※Arduino UNOだから。
  ※UNOの時は(word)を付けてなかった。
  ※(t - tn)、符号無しwordだとtとtnの大小が逆に
   なっても差の値は正しく出てきますんで。
ところが、Picoは32bitで内部処理。
16bitで減算して比較するつもりが、32bit値に型変換され
てから比較されるのです。
  ※「暗黙の型変換と符号拡張」というヤツです。
tとtnの大小が逆になったらマイナスになってしまいます。
tnの値によっては、いつまでたってもdlyを越えることが
できません。

ということで、減算式(t - tn)の前に付けた
キャスト演算子(word)
これを忘れると動かないわけです。

※教訓:32bitマイコンはRAMをケチるな!

ちゃうちゃう。
 「暗黙の型変換と符号拡張」に注意!ということで。


※millis時間判定の異常、検証用スケッチの紹介
Arduino IDEでRaspberry Pi Pico:millisをwordで処理した時の異常


| | コメント (1)

Arduino IDEでRaspberry Pi Pico:PWMでD/A出力してA/D入力を試す

Raspberry Pi Picoの実力試験、まずはA/Dコンバータをば。
RP2040に乗ってるA/Dコンバータの分解能は12bit。
データシートを見ますと、その実力値を示す「ENOB」
(Effective Number of Bits)は「9bit」と記されています。
12bitだとVrefに2.5Vを使うと1bitあたり0.61mVとなります。

A/Dの入力電圧を可変するために、使ったのがPWM出力。
これも12bitに設定できるので、同一のVrefを使うと同じ
スケールにできます。

こんな回路で試しました。
Pwm_ad31
35pinのVrefにシャントレギュレータ「LM4050-2.5」
つないで安定化。
Picoの内部にはシャント抵抗(R7:200Ω)が入っていますので、
図のような接続で安定化できます。

そのVref をPWM周期で駆動するマルチプレクサを通して、
VrefとAGND電圧を切り替えます。
そして、LPFを通して0V~Vrefの直流に。
オペアンプでバッファしてPicoのA/D入力につなぎます。

PWM→LPF→DC電圧という流れのD/A、誤差要因は
オペアンプの特性。
使ったMCP6072、RR-in/RR-outの低オフセット電圧品。
ただ0V付近は1.0~1.5mVほどの不感帯が生じます。

PWM値と読み出したA/D値の差をグラフにしてみました。
PWM値0~4095を32ステップで可変しています。
  ※PWM値を0,32,64,92・・・と増加

まずはA/Dの平均値処理やA/D入力にCRフィルタを付けない
素の状態。(赤色線)
それと、回路図内黄色枠のように、A/D入力にCRフィルタを
装着して試してみます。(緑色線)
Cap082
「CRフィルタ」(1k+0.1uF)を入れた方は、
入力電圧が上がるとA/D値が減少する傾向が見えます。

RP2040のデータシートを見ますと、
ADC  Input Impedance」が「100kΩ」と
出ています。
どうやらこの抵抗で「分圧」されてしまっている
ようです。
ノイズを防ぐために抵抗+コンデンサをいれちゃダメ
というところでしょうか。

次はCRフィルタ無しでA/D値を平均処理してみます。
単純な加算平均です。 16回と64回を試します。
stepは同じで32。
Cap081_20220414152601
さらに。 A/Dの平均回数を64回にして、stepを4に
してみました。
Cap083
数値512,1536,2560,3584の4カ所で「」が
出現しました。

この4カ所の「段」、前後をstep1にして見たのがこれ。
  (平均回数は64回)
Cap084
「差」だと段に見えますが、値の変化で見るとこのように
「上昇が緩やかに」なっているのがわかります。
Cap085
16stepくらいの間、変化が止まっているように
見えます。
A/D変換直線性の性能ということでしょう。

とりあえずラズパイ・ピコのA/Dの実力ということで。

※テストに使ったスケッチ (.inoではなく.txtにしています)
   ・ダウンロード - pwm_ad3.txt

※パラメータ入力
PWMを出力するためのパラメータ設定入力、
手抜きしてますので注意を。
・起動時はEnter入力するとタイトルを出して始まる。
   電源オン、あるいはリセットとUSB通信開始の具合。
   USBがいつつながるのか?
   USB接続でPicoはリセット起動しないのか?
   このあたりがよくわかりません。
・5つのパラメータ入力、「#Start End Step Avr Wait >」
 「strtok」で文字のかたまりを分離して「atoi」で
 文字を数値に変えているだけで、数値範囲のチェックは
 していません。

※追記
実験の様子。 ブレッドボードを使ってます。
P11_20220415094801

※PWMによる12bit D/Aコンバータ、その精度を確か
めてみました。
0.1mVの計測、自動ではできないので手でメモしてます。

「段」の出現、D/A出力をミスっていたらということで、
0V付近、フルスケール付近、そして「512」付近の値を
調べてみました。
Pwm2

PicoのPWM出力、「0V付近を除いて」ほぼ計算どうり
の値が出ています。
  ※0V付近はオペアンプの性能。
フルスーケール値「Vref * 4095 / 4096」もちゃんと
出ています。
Arduino UNOのPWMのように「0は0で合っている」けど
「255で256/256」と、おかしなフルスケールにはなってい
ません。
ちゃんとPWMしています。
これぞ正真正銘の「analogWrite」。
  ※Arduino UNOのは似非のanalogWriteっす。

※参
Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMを使おう


※次記事:オペアンプ出力とアナログ入力間に入れた
 CRフィルタについて。
Arduino IDEでRaspberry Pi Pico:A/D入力が…あれっ?

※検索
macOSからPi Picoを使う - その11 [Pi Pico]
   似たようなデータが出現しています。


| | コメント (0)

2022年4月13日 (水)

Arduino IDEでRaspberry Pi Pico:Win7でのUSB問題解決です

2022年4月1日:ラズパイ・ピコをArduino IDEで動かそうとしたけど
以来、ピコと遊んでいます・・・

しかし問題が残っていました。
ピコのUSBがCOMポートとして認識してくれなかったのです。
そのせいで、スケッチをアップする時は「BOOTSEL」スイッチと
外付け追加した「RESET/RUN」スイッチの操作が不可欠でした。
   ※ドライブとしては認識してくれていた

その後、その解決方法が判明しました。
  結論は「Zadig.exe」を使えと。
    こちらではCOM34で認識してくれました。

※それまでの経過を簡単に
トランジシタ技術2022年5月号(今月号だ!)が
 「ラズパイPico」の特集。
A01_20220413095401
・第6章 1/fゆらぎUSB扇風機「Pico太郎」の製作
   著者:宮村智也さん
A02_20220413095401
 この記事に、Arduino環境の構築方法が載っています。
  「Earle Philhower版」 を使えと。
・参考文献にはこのpdf。
 https://arduino-pico.readthedocs.io/_/downloads/en/latest/pdf/
・ここに、Windows7でのUSB問題は「Zadig」を使って
 解決できると。

 このように解説されています。
Zad1

こちらでも、これで解決しました。
うまく行ったあとに表示させるとこんな具合に。

Zad2

これで、スケッチのアップロードに「BOOTSEL」、「RESET/RUN」
スイッチの操作が不要になりました。
また「Serial.print」でUSBへのデータ送出もできるようになりました。
めでたし、めでたし・・・

| | コメント (0)