arduino

2022年7月27日 (水)

M5Atom LITE/M5Stamp PICOのフルカラーシリアルLEDをライブラリなしで制御する

M5Atom LITE / M5Stamp PICOに付いている フルカラーシリアルLEDをライブラリなしで操作できたので、その方法です。
フルカラーシリアルLEDの仕様は▼のようにHIGH/LOWシグナルの長さで1Bitを表現、GRB各8ビット(計24Bit)を送信すれば色をせってできます。
仕様は単純ですが、問題は0.3μ秒の短いタイミングをどうやって計るかです。
M5Stampのライブラリを覗くと、アセンブリコードのループでタイミングをとっていました。

 

ArduinoIDEではタイマの最小単位は1μ秒なので、普通にやったのでは0.3μ秒は計れません。
ライブラリでやっているように無駄にループを回してタイミングをとるしかないのですが
コンパイラが無駄に賢くて、ループ内で値が変化しない、変化がループ外に波及しないコードは省略されてしまい、タイミング取りには使えません。
なので、最適化出来ない処理をループしてタイミングをとる必要があります。

Led

ArduinoUNOではシリアルLEDをSPI-MOSIに接続して、クロックを調整してタイミングを取る方法を編み出した人がいましたが
M5Atom LITE / M5Stamp PICOのシリアルLEDはSPIピンにはつながっていないのでこの方法は使えません。
そこで、digitalRead()にかかる時間でタイミングを取ってみました。
幸いな事にM5Atom LITE / M5Stamp PICOには読み取るのに丁度よいデバイス(ボタン)が付いています。
1000回繰り返して300μ秒±150μ秒に収まるようにdigitalRead()の回数を調整ます。
1000回で300μ秒なら1回あたり0.3μ秒だねって理屈です。

▼ 調整に使用したスケッチ


#define RGBPIN 27
#define BTNPIN 39
#define LEDPIN 25
int BTN = LOW ;

void setup() {
  Serial.begin(115200);
  while (!Serial) { delay(1);}

  pinMode(RGBPIN,OUTPUT) ;
  pinMode(LEDPIN,OUTPUT) ;
  pinMode(BTNPIN,INPUT) ;

  digitalWrite(RGBPIN,LOW) ;
  delayMicroseconds(80) ;

  Serial.println("--- STRAT");
  digitalWrite(LEDPIN,HIGH) ;

  unsigned long stratTime = micros( ) ;
  // -----
  for (int N=0;N<1000;N++) {
    digitalWrite(LEDPIN,HIGH) ;
    for (int L=0;L<3;L++) {
      BTN = digitalRead(BTNPIN);
    }
  }
  // -----
  unsigned long endTime = micros( ) - stratTime ;
  Serial.print("--- BIT 1 :");
  Serial.println(endTime);

  stratTime = micros( ) ;
  // -----
  for (int N=0;N<1000;N++) {
    digitalWrite(LEDPIN,HIGH) ;
      for (int L=0;L<2;L++) {
        BTN = digitalRead(BTNPIN);
      }
    }
  // -----
  endTime = micros( ) - stratTime ;
  Serial.print("--- BIT 0 HIGH :");
  Serial.println(endTime);

  stratTime = micros( ) ;
  // -----
  for (int N=0;N<1000;N++) {
  digitalWrite(LEDPIN,HIGH) ;
    for (int L=0;L<5;L++) {
      BTN = digitalRead(BTNPIN);
    }
  }
  // -----
  endTime = micros( ) - stratTime ;
  Serial.print("--- BIT 0 LOW :");
  Serial.println(endTime);

  Serial.println("--- END");
  digitalWrite(LEDPIN,LOW) ;
}

void loop() {
}


ボタン状態の読み込み回数で1.5μ秒間隔単位くらいの調整ができるので、0Bit、1Bitの時間調整を行います。
±1.5μ秒の余裕があるので、近い値に寄せれば大丈夫です。 ※実際にはもうちょっと余裕があるっぽい。
で、digitalRead()でタイミングを取ってビットデータを送信するスケッチが▼


#define RGBPIN 27
#define BTNPIN 39
int BTN = LOW ;

void sendBitData(uint32_t bitData) {
  for (uint32_t sendBit = 0x00800000;sendBit!=0;sendBit>>=1) {
    if ((bitData & sendBit) == 0 ) {
      digitalWrite(RGBPIN,HIGH);
      for (int L=0;L<2;L++) {
        BTN = digitalRead(BTNPIN);
      }
      digitalWrite(RGBPIN,LOW);
      for (int L=0;L<5;L++) {
        BTN = digitalRead(BTNPIN);
      }
    } else {
      digitalWrite(RGBPIN,HIGH);
      for (int L=0;L<3;L++) {
        BTN = digitalRead(BTNPIN);
      }
      digitalWrite(RGBPIN,LOW);
      for (int L=0;L<3;L++) {
        BTN = digitalRead(BTNPIN);
      }
    }
  }
}

void setup() {
  pinMode(RGBPIN,OUTPUT) ;
  pinMode(BTNPIN,INPUT) ;
  digitalWrite(RGBPIN,LOW);
  delayMicroseconds(80) ;
}

void loop() {
  sendBitData(0x00FF0000) ;
  delay(500) ;
  sendBitData(0x0000FF00) ;
  delay(500) ;
  sendBitData(0x000000FF) ;
  delay(500) ;
}


PicoledAtomled

| | コメント (0)

2022年5月26日 (木)

AM2301BのCRC

AM2301BのCRC
情報が少なくて割と困ったので書いときます
秋月で売ってる温湿度センサー AM2306B
スペックシートに詳しい情報が載ってなくて (。´・ω・)? 状態
コマンドリファレンスがないとかどうかしてる。

中でもCRCの算出方法はチョット悩んだのでサンプル載せときます。
AM2301Bの使い方の動画はYouTubeにあげます。


// AM2301BのCRC計算
// 入力: uint8_t readData[6] - センサーから読み取ったデータ6Byte
// 出力: uint8_t crc - CRC8-Dallas/Maxim (X8 + X5 + X4 + 1)
//
// 生成多項式 : 1 + x^4 + x^5 + x^8 => B100110001 => 0x31
// 左シフト
uint8_t crc = 0xFF; // CRC初期値 0xFF
for (int i = 0; i < 6 ; i++) {
    uint8_t b = readData[i];
    crc ^= b;
    for (int x = 0; x < 8; x++) {
        if (crc & 0x80) {
            crc <<= 1;
            crc ^= 0x31;
        } else {
            crc <<= 1;
        }
    }
}


Image

| | コメント (0)

2021年12月 6日 (月)

ArduinoUNOのピン名ラベル貼ってみた

公式ArduinoUNOは、ピン側面にピン番号が刻印されているのがシールドを使う時に地味に便利

Label1

なので、ラベルシールを作って互換機にもラベルシールを貼ってみました

インクジェットプリンタ用のラベルシートにレーザープリンタで印刷したのでチョットかすれてしまいまいましたが・・・

Label2

ピン名が一目で分かるの便利すぎてワロタ

Label3

手持ちの互換機全部に貼ろう・・・と、思ったけど、透明シートに黒印刷したから

黒いピンソケットには貼れない・・・orz

白いラベルシートにしておくんだった (´・ω・`)

| | コメント (0)

2021年7月27日 (火)

2840円のUSBミニオシロスコープ買ってみた

OSC001 PCB SCOPE(USBミニオシロ/データロガー)
https://akizukidenshi.com/catalog/g/gK-11841/
を思わず買ってしまった。

2840円で2CHとか凄すぎ、USB接続で画面がキャプチャ出来るのもステキ
とか、勢いで買ってしまった。
高いものではないのでハズレでもそんなに痛くはない。

Osc001

買ってからGoogle先生に聞いてみると性能的には難ありだそうで
回路図が公開されているので見る人が見ると解像度的に「どうしてこうなった」な部分があるし、
データロガーとロジックアナライザ機能は実質使いものにならないレベルらしい。
ゆるく楽しむ分にはデジタル信号のHIGH/LOWが識別できれば良いので問題ではない。

オリンピックでロジスティクスが混乱していると言われていたがポチッた翌日に届いた、過去最速記録じゃあるまいか。
えっ?秋月だよねAmazonじゃないよね?とか2度見するレベル

ブレッドボードに直挿しで使えるのも便利だし意外ノイズも少なくて扱いやすい。

良いお買い物だった。

▲ArduinoのPWM出力を観測してみた。

| | コメント (0)

2021年3月 7日 (日)

BCDクロックを作ってみる(後編)

LED16個の損失は痛かったけど気を取り直して再チャレンジ。

今度は電源から始めてまずはI2Cの動作確認。
当初予定していた搭載方法では接触不良でRTCが動作せず (・Д・`)
搭載方法の変更&断線箇所発見に手間取り現在時刻をOLEDに表示する所までで4時間ががり。

ボタンの動作確認。
付ける抵抗間違えたか?電源の違いか?ボタン3の電圧値がブレッドボードで組んだ時より高くて認識できない。
スケッチの修正が必要。

慎重に導通を確認しながら配線。
導通チェッカー大活躍。
制御系を確認、シフトレジスタもちゃんと連携動作している。

LEDを一個一個確認しながら接続。
途中一個LEDが点灯せず原因解明に手間取る。
ランドがショートしてるのに気づけなくて仮付けだと光るのに、はんだ付けすると光らない…なんでじゃ〜って悩んだ (´・ω・`)

Fd192763120b4dd7b747622e08a35d35

16個のLEDが無事に接続完了。
アイスクリーム自販機型2進化10進数表示クロックできたよ〜 (*^ω^*)

972a5d744d5d45d9a8101ba7ae7dc086

| | コメント (0)

2021年2月27日 (土)

BCDクロックを作ってみる(前編)

micro:bitで時計を作ってからBCD(2進化10進数)表記の時計を作りたかったのですが、適当なガワが作れず断念していました。
今回、ツイにガワが出来ましたので中身を作ってゆきます。

Ffcb1be8cc974ce88dace305bb2dd8cb

(貧乏性なので)低価格化のためにATTiny85を使います。
ビットシフターは学校のチャイムを7セグメントで作ろうと思って買ったのがありますのでソレを使います。
※7セグメントを4個並べるよりOLEDをつけた方が安上がりだったので使わず余っていた。

まずはブレッドボードで検証。
LEDを16個も並べるの面倒くさいので半分で実験。
OLEDはデバック用、実機(?)には付けません。

B63f81586b914d2db26c9191b71b3e79

ビットシフターを駆動するのに3ピン、RTCに2ピン使うと時刻合わせ用のスイッチ入力に使えるのが1番ピン(リセット)しか残らない件 (・Д・`)
1番ピンをGNDに落とさなければリセットかからないのでスイッチ3個付けて時刻合わせUIに使う。
※ちなみに同時押しするとリセットがかかります。
このさい時刻合わせが出来ればOK、使い勝手は考慮しない(できない)

ココまではOK
後はケースに収めるべくユニバーサル基板に組みます。

勢いで始めたもので… 左右を間違えている事に気付いたけど左右が逆になっただけだからソフトで調整すればOK

… とか思っているうちに配置位置がクロスしてるから立体配線が大変な事になり…

…動かない…けど最早どこが間違っているのか調べる事すら不可能 :(;゙゚'ω゚'):

C60ba033406445e3b33bfef5c7cf8364

やっぱね、計画は必要だと思うんだ。

To be continue

| | コメント (0)