Arduinoでモーターで動く車を作りたい

Arduino+DRV8835

モーターで動く車と書いたけど、こういうのの総称ってなんていうんだろう。モーターカーもなんか違うし、ラジコンも無線操縦してるわけじゃないから違う。スマートカーっていうほど高度な機能はついてないし、自動運転車っていうと人を乗せる感がある。ミニカーだと動かない感じがするし、難しいね。

お買い物

車体

車体を買おうと思いAmazonやeBayを探してみたけど、あの黄色いタイヤのついたやつしか見つからない。ちょっと大きいしなんか小さい感じのないかなーと思って探し続けていたらxt-xinteでいい感じのを見つけた。

https://www.xt-xinte.com/h-product-detail.html?goods_id=576588

これ。

届いた。めちゃめちゃ雑多に袋に放り込まれており、皺くちゃの説明書がペライチで入ってるだけという、簡素なパッケージですね。

説明書は全部中国語。でも写真いっぱいだし構造も簡単なのですぐ組み立てられた。

じゃーん。車体ができたよ。

DC-DC降圧USBモジュール

ちっこいArduino互換品を使おうと思っていて、USB給電なのでそこに給電できるようにしないといけない。電池を使おうと思っているのだけど電池は一本1.5V。4本で6Vなので定格超えちゃうから降圧もほしい。ということでそれに合いそうな部品を買う。これもちっちゃいのがいいなーと探してみたらeBayにそれっぽいのがあった。結構種類があって、機能的には大体一緒っぽいんだけど使えなかったらヤなので種類変えて何個か買った。結局動いたのは

だけかな?あ、順番に試していってこれ使って初めて動いたのでこれにしたんだ。ということで電源はこれでオッケー。

配線する

回路図を作ろうと思ったんだけどなんかめんどくさかったので作ってない。気が向いたら作ろう。

配線はー、電池ボックスからUSBモジュールかましてArduinoへと、DRV8835へ。で、ArduinoからDRV8835へ。そんでDRV8835から2つのモーターへ繋ぐ感じにした。言葉だと分かりづらい。

こんななった。配線って微妙にセンスいるのね。なんかうまいこと収まらなくて見てくれ悪くなっちゃった。車体とパーツはマジックテープでくっつけた。

スケッチを書く

int PIN_IN_A1 = 9;
int PIN_IN_A2 = 10;
int PIN_IN_B1 = 1;
int PIN_IN_B2 = 11;

void setup() {
  pinMode(PIN_IN_A1, OUTPUT);
  pinMode(PIN_IN_A2, OUTPUT);
  pinMode(PIN_IN_B1, OUTPUT);
  pinMode(PIN_IN_B2, OUTPUT);

}

void forward() {
  digitalWrite(PIN_IN_A1, HIGH);
  digitalWrite(PIN_IN_A2, LOW);
  digitalWrite(PIN_IN_B1, HIGH);
  digitalWrite(PIN_IN_B2, LOW);
}

void brake() {
  digitalWrite(PIN_IN_A1, LOW);
  digitalWrite(PIN_IN_A2, LOW);
  digitalWrite(PIN_IN_B1, LOW);
  digitalWrite(PIN_IN_B2, LOW);
}

void reverse() {
  digitalWrite(PIN_IN_A1, LOW);
  digitalWrite(PIN_IN_A2, HIGH);
  digitalWrite(PIN_IN_B1, LOW);
  digitalWrite(PIN_IN_B2, HIGH);
}

void coast() {
  digitalWrite(PIN_IN_A1, HIGH);
  digitalWrite(PIN_IN_A2, HIGH);
  digitalWrite(PIN_IN_B1, HIGH);
  digitalWrite(PIN_IN_B2, HIGH);
}

void turnLeft() {
  digitalWrite(PIN_IN_A1, LOW);
  digitalWrite(PIN_IN_A2, LOW);
  digitalWrite(PIN_IN_B1, HIGH);
  digitalWrite(PIN_IN_B2, LOW);
}

void turnRight() {
  digitalWrite(PIN_IN_A1, HIGH);
  digitalWrite(PIN_IN_A2, LOW);
  digitalWrite(PIN_IN_B1, LOW);
  digitalWrite(PIN_IN_B2, LOW);
}

void rotateLeft() {
  digitalWrite(PIN_IN_A1, LOW);
  digitalWrite(PIN_IN_A2, HIGH);
  digitalWrite(PIN_IN_B1, HIGH);
  digitalWrite(PIN_IN_B2, LOW);
}

void rotateRight() {
  digitalWrite(PIN_IN_A1, HIGH);
  digitalWrite(PIN_IN_A2, LOW);
  digitalWrite(PIN_IN_B1, LOW);
  digitalWrite(PIN_IN_B2, HIGH);
}

void loop() {
  forward();
  delay(3000);
  brake();
  delay(3000);
  reverse();
  delay(3000);
  coast();
  delay(3000);
  turnLeft();
  delay(3000);
  brake();
  delay(3000);
  turnRight();
  delay(3000);
  brake();
  delay(3000);
  rotateLeft();
  delay(3000);
  brake();
  delay(3000);
  rotateRight();
  delay(3000);
  brake();
  delay(3000);
}

どう書くのがいいかなーと考えて、動きごとに関数を作って、Loopでそれを呼び出す感じにした。前進・後退・停止・空転・右折・左折・右旋回・左旋回を作った。えらい長くなって、同じようなコードが並んでいるのでもっと短くできそうだなーって思った。後で考えてみようかな。

完成

できた!電池ボックスが意外と重いので動きがギクシャクしてんねw電圧と電流のどっちを高くすればいいんかな。それとも電池単4に変えようかな。それはまぁ後でやってみるとして、早くBluetoothモジュール届かないかなぁ~。

カテゴリー: したい | タグ: , , , | コメントする

モータードライバを使ってみる Arduino+(TA7291P, DRV8835, TB6612FNG)

モータードライバ

モーターを使ってみたいので、モータードライバを買った。3種類買ってどれが一番いいんだろーなーと考えて、とりあえず全部試してみることにした。

大きさはこんな感じ。TA7291Pはモーター1個だけで、他は2個扱える。

スケッチ

int PIN_IN1 = 9;
int PIN_IN2 = 10;

void setup() {
  // put your setup code here, to run once:
  pinMode(PIN_IN1, OUTPUT);
  pinMode(PIN_IN2, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(PIN_IN1, HIGH);
  digitalWrite(PIN_IN2, LOW);
  delay(5000);
  digitalWrite(PIN_IN1, HIGH);
  digitalWrite(PIN_IN2, HIGH);
  delay(5000);
  digitalWrite(PIN_IN1, LOW);
  digitalWrite(PIN_IN2, HIGH);
  delay(5000);
  digitalWrite(PIN_IN1, LOW);
  digitalWrite(PIN_IN2, LOW);
  delay(5000);
}

delayは5秒にしたり3秒にしたりしてる。

TA7291P

動く。なんか弱い。

DRV8835

動く。強め。

TB6612FNG

動く。いぇい。これだけ、論理入力の他に、スタンバイとPWMのラインにも入力しないと動かない。ので線が2本多い。でもまぁ使える。

感想

モータードライバの選定にあたって、自分にとってはとりあえずGPIOの電圧でドライバの電源が入るってのが大事だったので、この3つはどれもそれを満たしてる。どれ使ってもいいんだけど、やっぱDRV8835がいい感じに思えるなぁ。

関係ないけどBluetoothに難儀してる。スマホ使ってラジコン作りたいので、太陽誘電のBluetoothモジュール買ってみたけど、スマホのターミナルから動かせない。。。こんどはHC-06を買って試してみようと思ってる。ここさえ何とかなれば作成の目途が立つんだけどなぁ。

カテゴリー: したい | タグ: , , , , , | コメントする

デジタルアラーム時計キットを組み立てた

Feichao 4 Bits Electronic Clock DIY Kits

はんだ付けがしたいなーとムラムラした。はんだ付けって変な魅力がある。はんだ付け練習用基盤でも買おうかなと思ったのだけど、せっかくならなんか作りたいと思って電子工作キットを探していたら小さい時計を見つけた。仕組みとかプログラミングとかは全然してない。組み立てただけ。

https://www.xt-xinte.com/h-product-detail.html?goods_id=671796

XT-XINTEって初めて使った。激安で、詐欺だったらやだなーと思ったのだけど、なんかドローンを趣味にしてる人とかは使ってるみたい。この時計キットで170円ぐらい。送料かかるから、実際には280円ぐらいになったのかな。これの他にも買ったので均等割するとそんな感じ。

お写真メイン

包装

チャック付き袋にごっちゃに入れられてきた。電子部品の足曲がってたよ。まぁいいけど。

取説

ペライチが入ってるだけだった。まぁいいんだけどさ、スイッチ付いてるみたいだし機能説明とかないの。ないのね。

部品チェック

下着ドロが捕まったときみたいにきれいに並べられない。たんと揃ってる。

仮組み

うん。ちゃんと組めそう。スイッチの向きとかコンデンサの向きとかあんま自信なかったのでなんか説明サイトとかないかなと探したら、動画を見つけた。

おっちゃんが作りながら解説してくれる。今はみんな動画ね。ICチップが違うみたいなんだが結果的には大丈夫だった。これはもしやコピー商品とかなのだろうか。

出来上がり

でーん。いつも思うんだけど赤色LEDって写真にうまく写らないね。アラームは2個セットできて、8時から20時までの間は1時間毎に音が鳴るようにもできるみたい。結構音がうるさい。これは5Vが作り方分かんなかったから、単4電池4本で6V駆動してるからかな。危険だから真似しないようにね。

はんだ付けしただけだけど、満足!作ったっきりしまい込んじゃうだろうけどね。ほんとは回路図見ながらなんでここはこうなってるのかとかやりたいけど体力がない…。

カテゴリー: できた | タグ: , | コメントする

ちっちゃいArduino互換品買った

Arduino Leonardo互換品

正式名称なのかどうか分からんけど、ebayでは左から、SS Micro、CJMCU、DM Micro(もしくはBeetle)と呼称されてる。1個500円ぐらい。Arduino Leonardo互換品でチップにはAtmega32U4っていうのが使われてるみたい。右のDM MicroにはURLがプリントされてて、公式の販売サイトがある。

https://www.diymore.cc/collections/hot-sale/products/diymore-beetle-badusb-micro-atmega32u4-au-development-expansion-module-board-for-arduino-leonardo-r3-5v-i2c

Bad USBってなんだろ?と思って調べてみたら、USBメモリに擬態して勝手にプログラム走らせるみたいな使い方もできるみたいね。まぁそんなことはしないからいいとして。Arduino MicroやNanoより小さくてかわいい。試しにLチカしてみる。

Lチカ

DM Microが、まだ製品としての体を成してる気がするのでそれを使うことにした。LEDは基板上にあるみたいなので、それが光る。

接続

こんな。PCと接続すると、はじめからBlinkが書き込まれてるらしく点滅した。

Arduino IDEをインストール

https://www.arduino.cc/en/main/software

インストールしたらツール→ボードをArduino Leonardoに、ツール→シリアルポートでこれを指定する。

プログラミング

ファイル→スケッチ例→01Basis→Blinkを選ぶ。

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://www.arduino.cc/en/Main/Products

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Blink
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

こんなんが表示される。光り方をちょっと変えたいので、void loop()内を

void loop() {
  int t = 5000;
  for (int i = 0; i <= 20; i++) { 
    digitalWrite(LED_BUILTIN, HIGH); 
    delay(t); 
    digitalWrite(LED_BUILTIN, LOW); 
    delay(t); 
    
    if (t > 50) {
      t = t / 2;
    };
  }
}

こんな感じに書き換えてみた。そしたら、スケッチ→マイコンボードに書き込むってすると

でけた!すげー、こんなちっちゃいのにちゃんと動いてる。

参考

http://www.musashinodenpa.com/arduino/ref/

カテゴリー: のーと | タグ: , , , , , | コメントする

TA7291Pの代わりってないのかしら

モーターを動かしたい

モーターを動かしたいんです。で、いろんな解説サイトに載ってるTA7291Pが売ってないんです。なんか生産終了らしくて。

https://toshiba.semicon-storage.com/jp/product/linear/motordriver/detail.TA7291P.html

なんか代替品とか無いのかなーと思ったのでちょこっと調べた。

TA7291P

代替品を探すのだから、まずは元のスペックを把握してそれに近いものを選べばいいのではないか。正直まだデータシート見てもどういう意味だかよく分かってなかったりするけど、まとめてみるなし。

ロジック側電源電圧 VCC 出力側電源電圧 VS 制御電源電圧 Vref 出力電流 IO・Ave 出力電流 IO・Peak 電源電流(正転・逆転) ICC 入力電圧 VIN
TA7291P 4.5~20 V 0~20 V 0~20 V 1.0 A 2.0 A 8.0~13.0mA LOW:GND~0.8V
HIGH:3.5~5.5V

こんな、感じ…?こんぐらい比較すれば大丈夫なんじゃないかなー。

TA7288P

ロジック側電源電圧 VCC 出力側電源電圧 VS 制御電源電圧 Vref 出力電流 IO・Ave 出力電流 IO・Peak 電源電流(正転・逆転) ICC 入力電圧 VIN
TA7288P 4.5~18V 0~18V 0~18V 1.0A 2.0A 17~30mA LOW:GND~0.8V
HIGH:3.5~5.5V

これも生産終了予定品。aitendoとかにまだ売ってるみたい。電源電流が気になる。

LB1641

ロジック側電源電圧 VCC 出力側電源電圧 VO 制御電源電圧 Vref 出力電流 IO・Ave 出力電流 IO・Peak 電源電流(正転・逆転) ICC 入力電圧 VIN
LB1641 5~18V 6.6~7.4V ±1.6A 3~10mA -0.3~VCC

形が似てる。クソみたいな感想ですがなんとなく良さげ。出力電圧の幅が気になる。aitendoで売ってるみたい。

DRV8835

ロジック側電源電圧 VCC 出力側電源電圧 VS 制御電源電圧 Vref 出力電流 IO・Ave 出力電流 IO・Peak 電源電流(正転・逆転) ICC 入力電圧 VIN
DRV8835 –0.3~7V –0.3~12V –1.5~1.5A –0.5~VCC + 0.5

Raspberry Piで学ぶ電子工作」の著者さんが推奨してるやつ。秋月で売ってる。はんだ付け必要。もうこれでいいんじゃないかななどと思ったり。

TB6612FNG

ロジック側電源電圧 VCC 出力側電源電圧 VS 制御電源電圧 Vref 出力電流 IO・Ave 出力電流 IO・Peak 電源電流(正転・逆転) ICC 入力電圧 VIN
TB6612FNG 2.7~5.5V 2.5~13.5V 1.2A 3.2A 1.1~1.8mA -0.2~6V

スイッチサイエンスに売ってる。はんだ付け必要。これなんかいい感じじゃないですかね。

TB6643KQ

ロジック側電源電圧 VCC 出力側電源電圧 VS 制御電源電圧 Vref 出力電流 IO・Ave 出力電流 IO・Peak 電源電流(正転・逆転) ICC 入力電圧 VIN
TB6643KQ →と共用 10~45V 2.5A 8A 2.5~8mA 0~5.5V

知恵袋で紹介されてたやつ。ちょとオーバースペックかなぁ。

考え中

色々あるっぽい。使うモーターにもよるようなので、何がしたいのか、何が必要か、をもうちょっとはっきりしてから選定したほうがいいっぽい。ebayにTA7291Pまだ売ってたからそれにしちゃおっかな…。

カテゴリー: のーと | タグ: , , , , , , | コメントする

TM1630のライブラリっぽいものを作りたかった

TM1630

こう、なんていうか、誰かが作ったライブラリを使う時って、importして、インスタンス作って、メソッド使うみたいな感じだと思うんだけど、そういうのを自分も作れたらいいなーと思って。で、そういうのはクラスを作ったりするオブジェクト指向プログラミングが必要みたいなことはなんとなく分かる。ただ、イマイチちゃんと分かってないので書けたとしても、それが果たして正しいのかという。でもまぁとりあえずやってみてダメなところを気付けるようにしたい、みたいな。っぽいってつけるのは、ライブラリ作りました!って言えるほどのことは出来てる自信ないし、おこがましいしみたいなことで。ダラダラつらつら。

https://dalomo.net/blog/2019/10/25/739/

この記事の手続型?逐次型?のプログラムをオブジェクト指向型っぽく書き直していってみる。

ソース

import pigpio

class TM1630:

    #0-9, " ", %L, %R, degL, degR
    DISP_HEX = [0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f, 0x0, 0x6b, 0x5d, 0x63, 0x39]

    def __init__(self, pi, DATA_PIN, CLK_PIN, STB_PIN):
        self.pi = pi
        self.DATA_PIN = DATA_PIN
        self.CLK_PIN = CLK_PIN
        self.STB_PIN = STB_PIN

        self.pi.set_mode(DATA_PIN, pigpio.OUTPUT)
        self.pi.set_mode(CLK_PIN, pigpio.OUTPUT)
        self.pi.set_mode(STB_PIN, pigpio.OUTPUT)

        self.pi.write(DATA_PIN,0)
        self.pi.write(CLK_PIN,1)
        self.pi.write(STB_PIN,1)

    def breakSTB(self):
        self.pi.write(self.STB_PIN,1)
        self.pi.write(self.STB_PIN,0)

    def write_databit(self, bin):
        if bin == 0:
            self.pi.write(self.DATA_PIN,0)
        elif bin == 1:
            self.pi.write(self.DATA_PIN,1)

    def write_byte(self, hex):
        for i in range(8):
            shiftb = hex >> i & 0b1
            self.pi.write(self.CLK_PIN,0)
            self.write_databit(shiftb)
            self.pi.write(self.CLK_PIN,1)
            self.pi.write(self.CLK_PIN,0)

        self.pi.write(self.CLK_PIN,1)

    def begin(self):
        self.pi.write(self.STB_PIN,0)

    def end(self):
        self.pi.write(self.STB_PIN,1)

    def set_displaymode(self, hex):
        self.write_byte(hex)
        self.breakSTB()

    def set_datacommand(self, hex):
        self.write_byte(hex)
        self.breakSTB()

    def set_displayaddress(self, hex):
        self.write_byte(hex)

    def set_displaycontrol(self, hex):
        self.write_byte(hex)

    def str2segdata(self, str):
        arr = []
        for i in range(4):
            arr.insert(i, self.DISP_HEX[int(str[i])])

        return arr

    def write_data(self, str):
        ADDR_BASE = 192
        data = self.str2segdata(str)

        for j in range(4):
            self.set_displayaddress(int(ADDR_BASE + j * 2))
            self.write_byte(int(data[j]))
            self.breakSTB()

    def display(self, str):
        self.begin()
        self.set_displaymode(0x0)
        self.set_datacommand(0x44)
        self.write_data(str)
        self.set_displaycontrol(0x8f)
        self.end()

ということでとりあえず書いてみた。意識してクラス書いたの初めてかもしんない。取りあえず動くは動く。TM1630はいろんな機能があるし、もっとそういう設定もできるように作りたかったけど、途中で力尽きてしまった。

改善点・疑問点

  • selfってこんなに使うもんなの。61個もあるんだけど省略したいよ。
  • スコープが分からん。どこにでもアクセスできるガバガバクラスになってると思う。インスタンス変数とメンバ変数とpublicメソッドとprivateメソッドとちゃんと考えて書いてない。
  • 前のプログラムを関数に切り分けていった、みたいな感じなので、クラス使ってるけどオブジェクト指向になってるかというとなってないんじゃないか。
  • 外部から使う関数って.displayだけなので他の関数は外から使えないようにしないといけないと思うんだけどやり方がわからない。
  • 肝心の.displayも4桁で0-9までしか対応してない。例えば123とか12345とかを引数にするとエラーになる。バリデーションとかもしてない。
  • %と℃を表示できるようにしたかったけど、力尽きたしまだどうすればいいか思いつかない。DISP_HEXのインデックス11-14はその名残。
  • など

でも、とりあえず形になったので、それはやっぱり嬉しいなぁ。

BME280の表示で使ってみる

BME280のサンプルプログラムの一番下

if __name__ == "__main__":

   import time
   import BME280
   import pigpio

   pi = pigpio.pi()

   if not pi.connected:
      exit(0)

   s = BME280.sensor(pi)

   stop = time.time() + 60

   while stop > time.time():
      t, p, h = s.read_data()
      print("h={:.2f} p={:.1f} t={:.2f}".format(h, p/100.0, t))
      time.sleep(0.9)

   s.cancel()

   pi.stop()

を、恐れ多くも

if __name__ == "__main__":

   import time
   import BME280
   import pigpio
   import TM1630

   pi = pigpio.pi()

   if not pi.connected:
      exit(0)

   s = BME280.sensor(pi)
   tm1630 = TM1630.TM1630(pi, 17, 27, 22)

   t, p, h = s.read_data()
   tm1630.display(str(int(round(h))).zfill(4))
   time.sleep(1)
   tm1630.display(str(int(round(p/100.0))).zfill(4))
   time.sleep(1)
   tm1630.display(str(int(round(t))).zfill(4))
   time.sleep(1)

   s.cancel()

   pi.stop()

て書き換えて、実行すると

こんな感じ。動くは動くでしょ。湿度→気圧→温度の順。

使ってみたい人用

https://dalomo.net/app/TM1630_for_Rpi_python.zip

そんな人いるかどうかわかんないけど、使ってみたい人いれば。直してくれたらもっと嬉しい。1から書き直しってレベルになるだろうけど。

参考

http://www.tohoho-web.com/python/class.html

https://note.nkmk.me/python-keyword-reserved-word/

https://teratail.com/questions/157952

https://note.nkmk.me/python-function-return-multiple-values/

https://www.itbook.info/network/python14.html

https://note.nkmk.me/python-str-extract/

https://qiita.com/Usek/items/a206b8e49c02f756d636

https://udemy.benesse.co.jp/development/web/python-list.html

https://note.nkmk.me/python-str-num-conversion/

https://note.nkmk.me/python-range-usage/

https://hacknote.jp/archives/23200/

https://note.nkmk.me/python-round-decimal-quantize/

https://qiita.com/soutarrr7/items/84e529d87aa3b3a9adcb

https://teratail.com/questions/143957

https://qiita.com/beatdown0514/items/361d6c213c2a1f2f5767

https://teratail.com/questions/162831

https://www.javadrive.jp/python/string/index9.html

https://yukun.info/python-typeerror-module-object-is-not-callable/

https://note.nkmk.me/python-format-zero-hex/

https://gammasoft.jp/blog/python-string-format/

https://note.nkmk.me/python-int-max-value/

https://e-tec-memo.herokuapp.com/article/191/

https://heppoko.hatenadiary.jp/entry/2013/11/20/043850

https://python.ms/object/class/method/self/

https://teratail.com/questions/146350

カテゴリー: したい, できた | タグ: , , , , , | コメントする

BME280をRaspberry Pi Zero WHで使ってみたい

BME280

7セグディスプレイとTM1630が使えるようになったので、なんか表示してみたいなーと思い、温度・湿度・気圧が計測できるBME280を使って取得した数値を表示してみたい。

お買い物

http://akizukidenshi.com/catalog/g/gK-09421/

やや高め。はんだ付けが必要なのでしてみた。

接続

オス-メスのジャンパワイヤ使い切っちゃった。

I2Cを利用してサンプルファイルを取得

SPIはADコンバータの時に使ったので、I2Cでやってみることにした。買った時に付いてた取説とデータシートを見てみたのだけど、さっぱり分かんないしやる気も起きず、参考サイトとか見ても結構な長さだったので、何をやっているのかを理解することは諦め、pigpioのexampleを流用することにした。

I2Cを有効化

raspi-configでInterfacingOptionに行き、I2Cをenabledにする。

i2c-toolsをインストール。

$ sudo apt-get install i2c-tools

そんで再起動。

動作確認

$ sudo i2cdetect 1

てすると

WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]

て聞かれるのでy。

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --

アドレスが見えた。

pigpioからpyファイルをダウンロード

今回メインパソコンが無かったので、頑張って落としてくる。

$ wget http://abyz.me.uk/rpi/pigpio/code/BME280_py.zip

でダウンロード。

$ mv BME280_py.zip /home/pi/nas

cdでカレントフォルダ移動する前に落としてきちゃったので、mvでファイルを移動する。

$ unzip BME280_py.zip

で解凍。BME280.pyが出てくる。

意外とCLI簡単!

サンプルファイルを使ってみる

サンプルファイルを

$ sudo python BME280.py

で実行すると0.9秒ごとに一分間計測値を取得して表示してくれる。

いえーい。

今度はこの値を利用して7セグディスプレイに表示できるようにしてこ。

参考

https://deviceplus.jp/hobby/raspberrypi_entry_039/

https://www.hiramine.com/physicalcomputing/espwroom02/bme280.html

http://abyz.me.uk/rpi/pigpio/examples.html#Python%20code

https://www.atmarkit.co.jp/ait/articles/1606/20/news024.html

https://www.atmarkit.co.jp/ait/articles/1607/26/news014.html

https://www.atmarkit.co.jp/ait/articles/1606/13/news024.html

カテゴリー: したい, できた | タグ: , , , , | コメントする

7セグドライバのTM1630をRaspberry Pi Zero WHで使ってみたい

7セグドライバのTM1630

7セグ1桁ができたので、4桁もできんだろー、ついでにドライバも使っちゃえーってやってみたら茨の道だった。まぁ大半はケアレスミスなんだけどさ。できるまでに

GPIOでクロックやらなんやらを自前で書いてみる→できない。

もしやSPIでいけるのでは?と試してみる→できない。

ふて寝

自前で書いたピンの指定が間違ってることに気づく→できた!

という流れでした。デバッグの仕方がわからないのが痛い。動かないときになにをやれば動くようになるのかの手がかりがないから、立ち往生してしまうのです。とりあえず動いてくれたのでメモメモ。

お買い物

http://akizukidenshi.com/catalog/g/gI-13223/

http://akizukidenshi.com/catalog/g/gI-09971/

TM1630がカソード専用だって分かんなくて最初アノードコモンのLEDを買っちゃったのは秘密だ。

接続する

繋いだ。これはこれで結構大変じゃんね。

コード書く

今回もコメントで考えたこと書いてこ。

# pigpio使う準備
import pigpio

pi = pigpio.pi()

# 使うGPIOピンを指定(BCMで)
DATA = 2
CLK = 3
STB = 4

# 表示する数字を16進数で持っておく。0→9
HEX_NUM = [0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f]

# それぞれのピンを出力で設定。
pi.set_mode(DATA, pigpio.OUTPUT)
pi.set_mode(CLK, pigpio.OUTPUT)
pi.set_mode(STB, pigpio.OUTPUT)

# 初期状態に設定する。
pi.write(DATA,0)
pi.write(CLK,1)
pi.write(STB,1)

# 8bit出力するための関数。
def WriteByte(hex): # 16進数の数字を渡す
    for i in range(8): # 8bit分だけ処理する。
        shiftb = hex >> i & 0b1 # LSB→MSBで出力するのでカウント分ずつ右シフトして1と論理積を取り、1桁だけ取り出す。
        pi.write(CLK,0) # クロックの立ち上がりエッジでデータを読み取られるのでLOWにしておく。
        # シフトした数値に応じてデータピンをHIGHかLOWに出力する。
        if shiftb == 0:
            pi.write(DATA,0)
        elif shiftb == 1:
            pi.write(DATA,1)
        pi.write(CLK,1) # クロックをHIGHにしてデータを読み取らせる。
        pi.write(CLK,0) # 戻す。これいらないかも?試してない。
    pi.write(CLK,1) # 8bit分処理が終わったら、クロックを初期状態に戻す。

#こっからメイン。
pi.write(STB,0) # STBをLOWにするのが初めの合図みたい。
WriteByte(0x0) # 表示モード設定(桁数、seg数)
pi.write(STB,1) # 1つコマンド送ったらSTBをHIGHにして
pi.write(STB,0) # またLOWにする。
WriteByte(0x44) # データコマンド設定(表示かキー読み取りか、自動アドレスか固定アドレスか、通常モードかテストモードか)
                # 一度自動アドレスモードを試してみたが、なんか上手くいかなかったので固定アドレスモードにした。
pi.write(STB,1) # 同上
pi.write(STB,0)
WriteByte(0xc0) # アドレスコマンド設定。今回DPは使わないことにしたので(わけわかんなくなった)どの桁に表示するか決めるとこと考えて良い。
WriteByte(HEX_NUM[1]) #表示したい数字。固定アドレスモードの場合、アドレスとデータの間にSTBの出力はいらない。
pi.write(STB,1) # 一個終わったらSTBをHIGH-LOWする。これなんか用語あるのかな。
pi.write(STB,0)
WriteByte(0xc2) # 2桁目
WriteByte(HEX_NUM[2])
pi.write(STB,1)
pi.write(STB,0)
WriteByte(0xc4) # 3桁目
WriteByte(HEX_NUM[3])
pi.write(STB,1)
pi.write(STB,0)
WriteByte(0xc6) # 4桁目
WriteByte(HEX_NUM[4])
pi.write(STB,1)
pi.write(STB,0)
WriteByte(0x8f) # 表示制御 (明るさ、表示のオンオフ)
pi.write(STB,1)

pi.stop() # 後始末。

表示数字の対応表

ICのseg
seg8 seg7 seg6 seg5 seg4 seg3 seg2
ディスプレイのseg
disp. g f e d c b a bin→hex
0 0 1 1 1 1 1 1 0x3f
1 0 0 0 0 1 1 0 0x6
2 1 0 1 1 0 1 1 0x5b
3 1 0 0 1 1 1 1 0x4f
4 1 1 0 0 1 1 0 0x66
5 1 1 0 1 1 0 1 0x6d
6 1 1 1 1 1 0 1 0x7d
7 0 1 0 0 1 1 1 0x27
8 1 1 1 1 1 1 1 0x7f
9 1 1 0 1 1 1 1 0x6f

で、動かしてみると

点いた!いやー長かった。ここにくるまでに

こんなんなっちゃったりして大変だったー。今度はこれを外部プログラムから使えるようにしたいなぁ。できるかなぁ。

参考

http://nopnop2002.webcrow.jp/8SEG-LED/8SEG-TM1637.html

https://garretlab.web.fc2.com/arduino/lab/led_driver_tm1630/

カテゴリー: したい | タグ: , , , , | コメントする

7セグメントLEDを使ってみたい

7セグメントLED

FEで時々出てきた7セグを発見したので使い方を確認したい。なんに使うかは決めてない。ただやってみたいだけ。

お買い物

http://akizukidenshi.com/catalog/g/gI-12644/

http://akizukidenshi.com/catalog/g/gP-00587/

http://akizukidenshi.com/catalog/g/gR-14326/

http://akizukidenshi.com/catalog/g/gP-00348/

使ってみる

7セグにはアノードコモンとカソードコモンがある。入と出のどっちかが共通なだけなので、今回はアノードコモンにした。OSL10326-IRのピン配置を勘違いしてて、逆Nの並びだと思ってて、点かねぇ点かねぇってやってたんだけど、実際は反時計回りの配列だった。データシート見てもわかんなくね。

で、配線を

物理PIN seg DIPスイッチ
1 A 1
2 F 2
3 G 3
4 E 4
5 D 5
6 DPin
7 DPout
8 C 7
9 Vin
10 B 8

こんな感じに。DIPには付けなかった。で、こうなるとDIPスイッチとセグメントの対応は

seg
num A B C D E F G
1 8 7
2 1 8 5 4 3
3 1 8 7 5 3
4 8 7 2 3
5 1 7 5 2 3
6 1 7 5 4 2 3
7 1 8 7 2
8 1 8 7 5 4 2 3
9 1 8 7 5 2 3
0 1 8 7 5 4 2

こんな感じ。見づらいなこの表。

結果

ちゃんとできた。これだけなのになんだか嬉しい。で、この後7セグドライバICを使って4桁のやつを点けようと思ったんだけどアノードとカソード合わせるの間違えてできんかった。また今度~。

参考

http://www.kotaden.com/stage3_3_index.html

カテゴリー: したい | タグ: , | コメントする

ユニバーサル基板を使って光センサーの部分を組みやすくしたい

はんだ付けしたい

はんだ付けってなんか変な魅力がある。ブレッドボードが手狭になってきてしまったので、扱いやすいようにしたいなぁと思って、光を感知する部分をモジュールっぽくしてみることにした。

はんだ付け

こんなんできた。ピンをはんだ付けする時にちょっと溶かしちゃった。あとスルーホール?ってなんか付けづらい。いっぱい流れ込んでしまう。あと8ch使えるのに1chしか使う気がない感じになったぜ。

裏。分圧どうやりゃいいのかよく分かんなかったから無理くりつけたらはんだがぽっこり。

組む

↑前回の。線がごちゃごちゃでなにがどうなってるか分かりづらいですね。さぁ、これがどうなったかといいますと

こう。大して変わんねーよ。配線のセンスが無いよなー俺。

動画できた

ライト点いてるときのほうが画質いい感じ。うーむ。とりあえず一段落にしよっかな。違うのもやってみたいし。

カテゴリー: できた | タグ: , , | コメントする