Arduino初心者熱烈大歓迎質問スレ part30
■ このスレッドは過去ログ倉庫に格納されています
PICはまだよく知らないけど
UNOをI2Cの親にして子をナノ20個くらい付けてアナログ入力全部入れて同時に測定するようなイメージ? UNOに300個のセンサーをつけようって時点でセンスがないから諦めた方がいい >>649
接続トポロジー的にはそんな感じ
I2Cじゃなくてもいいし同時測定じゃなくてもいいけど
はんだ付けとかできるの?
ユニバーサル基板? >>651
センスがあるからな
センスがない君は人一倍努力が必要だから楽ではないねw >>653
はは、完全に意味取り違えてやがるw
言語センスのないことだけは確かだな、お前は >>652
I2Cだと256台つながるらしいですが
他のつなぎ方でもたくさんつながるんですか? センスを1ビット表現で評価する人が、センスという概念についてどれぐらいセンシティブなのかって思う。
加えて、何のどの程度のセンスかについて議論することもなく、それをもって「諦めた方がいい」と言えるような感覚ってどこから来るんだろうね。
しかもそれが「初心者熱烈大歓迎質問スレ」で。
そういや、アナログ回路でも、他人にセンス(何のだ? 多様なアナログ回路全部をひっくるめて、アナログ回路かそれ以外か?) についても
1ビット表現をする人いたよな。UNOでA/Dコンバータでさえ10ビットなのに。 >>658
I2Cだと7bit or 10bitのアドレスで
7bit(128)-予約(16)=112台 もしくは10bit(1024)-予約(16)=1008台
たくさん繋ぐ方法はいくつも有るけど例えばSPI接続の場合でも
CSを増やせば複数(細かい話を無視すれば無限に)繋がる
UARTでも複数接続出来る
※いずれも一定以上に台数を増やすと静電容量やノイズの対策が必要になるかな
>650,654,657,660
この辺の人らは発言が{下品,寒い,幼稚}って自覚あるの???
ここ【学問・理系】のカテゴリーなんだし、もう少し知的な話をしようぜ! マルチプレクサの使い方
親子で使う方法
とても参考になりました
ありがとうございます >>661
同じセンサーをいっぱいつなげるとi2cのアドレスがかぶるのですがどうしたらいいですか >>664
◆アドレスの変更が可能な場合
単独で繋いでアドレスを変更(書き込み)してから使う
◆アドレスの変更が不可能な場合
例)アナログマルチプレクサを使用した場合の方法
・SCLは共通で接続する(台数が一定数より多い場合は回路の工夫が必要)
・SDA側をマルチプレクサで切り替えて使う
・SDAはマルチプレクサのセンサー側でPull-upする(不具合の対策でマイコン側もPull-Upも可) I2CでPICとかプログラムの書けるマイコンだと
プログラム内で番号付けたりして分けられないの? センサーやIC側で勝手にアドレス決められてやがるよな!0x70-0x76までとか!
なんだよあれ!こっちで決めさせてくれ! 自分でI2Cデバイスを構成できるものは別として、既成のデバイスはたいてい決まってるしね。
注文オプションで選択できるものとか、ピンのH/Lや電圧で設定できるものはあるけれど、そのあたりが限界かな。 >>665
アナログ使わんで、素直にI2Cマルチプレクサ使え >>669
それだとアドレスで分けられないんじゃなかった? >>658
自分がプログラムしたマイコン同士なら
I2Cじゃなくてもいろいろと方法がある
好きにプロトコル作って好きに通信すればいい
オープンドレインで1本だけでUART通信もどきとか
2本使って良くて遅くていいならI2Cが簡単かな
>>666
YES I2Cの切り替えにアナログマルチプレクサとか
センスなさすぎる まだプログラムの美しさや回路の完成度を求める段階ではないので
簡単で理屈が分かりやすくて動いてくれたら良いのです
分かりやすい説明本当にありがとうございます アナログスイッチを使い同じアドレスのI2Cデバイスを複数使用する例を置いときますね!
https://i.imgur.com/Otu2BH4.jpg ArduinodeIDE + ESP8266 のアップデートがあったのですが、
不具合があったので、とりあえず対処方法だけ。。。(Win環境)
半年前にあった macOS と同じ症状で、pyserialのバグっぽい。
以下から 3.4 をダウンロードして、Arduino15配下の同じ場所に上書きでOK。
https://github.com/pyserial/pyserial/releases >>679
配線方法は676の方が貼ったURLの方法と一緒ですね
・TC4051(8ch)アナログマルチプレクサを使用
・SCKを共有してSDAのみ切り替え
・SDAをマルチプレクサとI2Cデバイスの間でPull-Up
・ArduinoのdigitalWriteを2本使い4回路切り替え(3本使えば8回路切り替え出来る)
・マルチプレクサを重ねれば大量に接続できる
(例えば4051を9個使えばdigitalWrite6本で64回路切り替え出来る)
テストコード(スケッチ)と回路図も置いときますね
(※急ぎで作ったので何処かに間違いがあったらすまん)
https://pastebin.com/8aZPukMs (スケッチ)
https://i.imgur.com/7qgloE9.png (回路図) >>674
双方向トランシーバとかで切り替えるのは結構面倒くさいぜ 今頃気づいたけど、PicoをArduinoとして使う記事がいつの間にかさらっと公開されてた
Raspberry Pi PicoをArduinoにしてモーションを検知してみる
https://mag.switch-science.com/2021/04/28/pir-with-arduino-raspberry-pi-pico/ Raspberry Pi 4上のArduino IDEでも
ボードマネージャからArduino Mbed OS RP2040 Boardsを追加できることを確認 Raspberry Pi 4で開発してる人で
Raspberry Pi picoに書き込みができない人はここ見るといいかも
https://www.raspberrypi.org/forums/viewtopic.php?t=309215
boot selボタンを押しながらRaspberry Pi 4のUSBにPicoを差してから
cd ~/.arduino15/packages/arduino/hardware/mbed_rp2040/2.1.0
sudo ./post_install.sh
と実行してから「マイコンボードに書き込む」を実行するとうまく書き込めた 昨日初めてArduinoを触ったんだけど、素朴な疑問が。
PCからの書込み用にUSBシリアルポートを使ってるみたいだけど、PCとの通信にも同じシリアルポートを使っている。
ボーレートを変えて設定して通信した後リセットとかしなくても書込みができるのは、どうやってんのかな? >>688
USBシリアル変換チップの信号(DTR)を使ってArduinoをリセットしてる
ArduinoをリセットするとROMのブート部分に書き込まれてる命令で、シリアル通信の設定が初期化されて書き込みが出来る >>688
あなたが書き込んだのとは別のブートローダというプログラムが動いてるから Arduino で I2C OLED 1.3インチにメニューを表示して
タクトスイッチでカーソルを上下して選択し、その選択にあった
次の画面に遷移するような事をやりたいのですが、
コードがぐちゃぐちゃになってしまいました。
画面を構成したり、ボタンとカーソルを連動するのに便利な
ライブラリがあればご教授ください!!
ちなみにタクトスイッチは3つで、上/下/決定ボタンのように
使用したいです。 丸投げか・・・
いったんソース捨てて新規に整理して作り直せよ。 >>691
ふつうにif else文でやってるわ…
選択して決定Bが押されたらLCDクリアして
次の画面を表示してる
あとは30秒操作無しならキャンセル…って表示を出して
ループに回帰とか >>691
構造体のリスト構造で階層を記述して、リストを手繰るロジックにすれば、それ程難しくならないはず。
階層構造をプログラムロジックにハードコーディングすると収拾付かなくなりますよ。 youtubeの情報を参考にメニュー作ってみます。
親画面から子画面に移ったり孫画面に移ると画面数が多くなるので、間違わないような記述を考えながらやるしかないですよね。
if else文できれいに書けるかどうかやってみます。 いいね
ライブラリで出来ました〜じゃ経験値は増えないからね arduinoでクラス使えたら楽に出来るのにね
と思ってふとググったらクラスあったのね
勝手にないもんかと思ってスパゲティいくつか作ってたわ 逆にクラスになってないライブラリなんてあるのかね? ありがとうございます
知ってた方が良さそうだから勉強してみます >>704
手続き型言語しかやってないのだと思うけど、
ざっくり説明できるものではない。
継承、抽象データタイプ、カプセル化とか言っても分からんでしょ?
今更、オブジェクト指向から勉強しろとは言わないけど、
検索するなり、本気で知りたいなら本でも買いなよ。 >>708
そうですね
まるきりここで教えていただくつもりもありませんので
失礼しました とりあえず関数にまとめるだけでも良いんでないの。もうやってるかもだが。 ATMega168のピンだけで9桁の7セグをダイナミック駆動させたけど、なんか暗い
200Mhzぐらいで点灯させても暗い
3.3Vで屋外運用したいけど、ちょっと暗いんでいい方法あります?
Max7219とかLEDをドライバICもあるけど、8桁用なんで。9桁欲しい
参考にしたサイト。やっぱトランジスタ使わないとダメですかね?
https://garretlab.web.fc2.com/arduino/introduction/beginning_with_7segment_led_cc/ >200Mhzぐらいで点灯させても暗い
200Hzの間違いですw 周波数上げ下げしてもdutyが同じなら変わらん。duty上げるか電流上げるか。 そこにある通り240Ωの抵抗を使ったなら7mAしか流れてないから最大値の20mAに程遠く、暗いのは当たり前
OSL40562-LBという7セグメントLEDはとても明るいらしいけど君が使ったのはそうではないんだろう
20mAまで流してそれでも暗いかどうか判断すべきじゃないのかな >>714
抵抗は下げましたね。でもそんなに変わらず。
duty上げるのは更新頻度を上げるのとまた違うんですかね あと、内部クロックの8Mhzで動かしてるんですが、
digitalWrite自体遅いでしょ?ポート直接叩いて高速化したほうが良いのかな
参考サイトのスケッチ通りdigitalWriteを使っても、200Hzぐらい余裕で出ます? >>716
あ、そうする予定です。屋外なので防水も兼ねて まずデューティー比、というかPWMについて勉強しよう!
そして希望の明るさがでる電流値がいくらなのか実測しよう! 抵抗下げたって行ってるけど、具体的な数字が出てないから、電流流しすぎてLED焼いたんじゃね
一度焼け焦げたLEDは適切な電流流しても暗くなるよ 9桁なら理想的な条件でも平均的な明るさは一桁だけ点灯し続けてる場合の1/9になると思え
桁数を増やせば増やすほど同じLEDなら暗くなる
更新頻度を上げても明るさのチラつきが減るだけで平均的な明るさは基本的に変わらない
いっそのこと更新頻度を思いっきり下げて一桁ずつ順に点灯するように見えるようにすると点灯桁は明るく見えるようになる >>711
えーーっと、参考にしたサイトにも書いてあるけど、ここで使用している7セグと
同じ様な接続方法で動作させる機器の場合、1セグ分のLEDが並列接続されて
いるので、240Ωの抵抗で接続したとしてもカソードに接続する入出力ピン(ピン
接続のところで言えば12番に接続する入出力ピン)に50mA位流れてしまい、
Arduino UNOの1ピン40mAまでの制限に引っかかり、9桁だと全点灯した場合
450mAとATmega328Pの制限(168も同じかはデータシートを見てね)最大電流
200mAを超えてしまうので、1セグ分でテストを行うだけならばまだしも、
Arduinoだけで9桁分の電源を供給することは出来ません
点滅させてうまい具合に制限を超えないようにスケッチを書けば出来なくも
無いかもしれませんが、制御が煩雑だと思うのでドライバICを複数使うとか
した方が良いと思いますよ
点滅と明るさについては、どのように制御しているのか分からないので単純に
どうなるとは言えないですが、点滅周期を早くすると暗くなることはあっても
明るくなることは無いはずです
点滅させるということは消えている間は光らないということなので、光る時間が
短いほど感覚的には光り方が暗く感じるということになります。このとき、点灯
させる全てのLEDを順番に点灯->50ms待って全部消灯->50ms待って全部
点灯と繰り返すのと、待ち時間を25msに変えた場合では点滅周期は25msの
方が早くなりますが、1秒間の点灯時間は同じ500msになるため点滅周期を
単純に変えても明るさは変わらないってなります(厳密には間違っているけど)
点滅で輝度を擬似的に変化させようとする場合には、一切消灯しない場合が
輝度100%、単位時間当たりの消灯時間を増やしていけば、消灯時間の割合に
比例して輝度が低くなり、この割合をDutyって呼びます
点滅の周期が長いと普通にチカチカ点滅して見えてしまいますが、点滅を早く
すると人間の目で見た場合連続して点灯しているように見えるので、点滅で
輝度を制御する場合には点滅周期を短くした方が良いということになりますが、
Duty制御を行わないと単位時間での点灯時間が変わらないので意味が無いと
いうことになるです >>723
ダイナミック点灯だから最大でも1セグ分しか同時には流れんぞ。 >>721
流石に焼いたら分かりますよw
>>722
やっぱ9桁がネックですかねー。試しに1桁ずつやってみます。
今まで通りドライバIC使いますわ。皆さんありがとうございました。 >>723
なんか長文書いていただいてありがとうございます。
所々参考にします。 >>725
バックライトつきのキャラクター液晶とかOLEDはだめなんかな。 >>728
桁数が増えると結局そっちのほうが楽ですね。それも考えたんですけど、
数メートル離れた所からでもよく見えるように視認性を考えたら7セグかなぁと思って。
7セグ好きっていうのもあるけどw
大型液晶だとコストも増えるので予算1,000円以下/個に収まらないと思うので 8桁までならモジュールになったやつとか結構種類あるからArduinoにポン付でいけるけど
9桁だとほとんどないなTM1638とかTM1640かな HOLTEKのHT16K33は16桁まで表示できて良いですよ
価格もそんなに高くないし、I2Cで楽だし複数個繋げられるし
自分の中では最強の7セグドライバーかなと思ってますね すみません。
電子工作初心者なのですが、ArduinoとMAX30102(VIN,GND,SCL,SDAの4ピン)を使って、血中酸素濃度計測器を作っています。
コードも配線もなんとかなり、プレップボード上では動作するに至りました。
そこで、常時体につけておくセンサー部と、廊下の床においておくArduino本体部を分け、取り回しをようと、その間を1.5mほどの配線で渡したのですが、そうすると動作しなくなります(センサーLEDが点灯しない)。
1.5mの配線に問題があるかと思い、Lチカのみで試すと光ります。
どのような原因が考えられるでしょうか?やはり配線が長すぎでしょうか?
何卒よろしくお願いいたします。 >>734
恐らくPull-up抵抗値が高い(内蔵Pull-Upだと)のが原因だと思いますが
(距離が伸びた事で静電容量が増えI2Cの信号の立ち上がりが遅くなりうまく通信出来ていない)
動作電圧の関係でMAX30102単体だとArduino(UNOだとしたら)とは直接接続できません!
使用してるのはMAX30102を使ったモジュールだと思います
モジュールには周辺回路が有ると思うのですが、その回路により対処が異なるのでモジュールの詳細をお願いします
あと別の解決方法としては通信速度(I2Cのクロック)を下げれば動作はすると思う >>735
ご教示いただきありがとうございます!
理屈を理解できていないながらも、I2Cを400kHzから100kHzに落としてみましたが、動きませんでした。
センサーはMakerfireのMAX30102のモジュールを(amazonで購入)
コードはこちらを
www.hackster.io/gatoninja236/open-source-pulse-oximeter-for-covid-19-4764c5
配線ケーブルはこちらを使用しております。
www.yodobashi.com/product/100000001001083291/
もしお気づきの点があれば何卒ご教示ください。プルアップ抵抗という概念は初めて知ったため、もう少し勉強させていただきます。 >>736
考えられる対策は以下のもの
プルアップ抵抗の値を小さくする
シールドケーブルを使う
クロック数を落とす >>736
おそらく基板側で3.3V用にPull-upされてるのが原因だと思います
下の写真の半田を除去して5VでPull-upしたら通信出来ると思います
https://i.imgur.com/SIYPPpB.png
近い回路図が有ったので回路図も参考にしてください (上の半田除去は赤印の所を切りな話す)
※回路図では1.8Vと3.3Vの切り替えラインは記載が無く1.8VでPull-upされてる
https://i.imgur.com/omJYXze.png
半田除去後SDA,SCLを1〜4.7kΩ程度の抵抗でull-upしたら状況が改善すると思います
画像の紫点線の抵抗がPull-Up抵抗です
https://i.imgur.com/GrrINOa.png
735で直接通信出来ないと書いたのは間違いでしたごめん
データシートよく読んだらI2Cバス(や他のIO)の電圧は6VまでOKだったので忘れてください UNOを3年ほど使い倒してからEsp32デビューしたんだけど
このADCって使えないレベルなの…? >>740
至る所で直線性が悪いだとか精度が良くないとか
ADCのキャリブレーションがあるとか見るから…
なにやら時間取られそうだなぁって思って… nanoやUnoの様な形でなくATMega328をそのまま使う場合、
9 ,10ピンに水晶をつなぎそれぞれ22pFを介してGNDにつなぐことが一般的に紹介されています。
この22pFの目的はノイズ除去であって発振そのものには直接的には関係していないという理解でよろしいでしょうか?
もちろん極端に大容量を繋ぐと発振しないでしょうが、Openに対しコンデンサを入れる意味という観点で。
試しに有り無しをオシロで観察したところ波形がやや崩れ気味、9/10ピンでDCオフセットが出る程度で波形の振幅は両ピンOpenのほうが大きいくらいでした。 >>744
正しい発振に必要なのでついている、水晶発信器の仕組みを調べろ
それとクリスタル毎に負荷容量が決められていて基板の寄生容量も考えた上で正しい容量にしないとカタログで示された周波数になっていない >>744
水晶に対して適切な負荷容量が決まってます
コンデンサが無くても発信してるようですが周波数は高くなってると思います
またオシロスコープのパッシブプローブ(1:10)を当てるとプローブにより10〜15pF程度負荷が増えますので状況(周波数)が変わります
http://www.tamadevice.co.jp/crystal-units-kaisetu.htm
https://www.macnica.co.jp/business/semiconductor/articles/basic/127525/
また、正確なクロックが必要なければ内蔵発信回路を使えば水晶すら要らないと思います 変換で発振が発信になった
調べるときは 「水晶発振回路 負荷容量」 とかで検索してね >>739
UNOに比べたら癖が強いのですが、仕様を理解してれば使えます
ESP32で正しく計測を行うためにはUNOより回路やスケッチに工夫が必要になると思います
・UNOのようにGND−VDD間の相対値での測定は出来ない(絶対値での測定になる)
・UNOに比べて内蔵リファレンス電圧のバラツキが多い(リファレンス電圧の測定値は工場でROMに書き込まれてる)
・電圧の測定範囲が限定されてる(100~950 , 100~1250 , 150~1750 , 150~2450mV)
(※経験上この範囲を超えていても値を取得できるが歪む)
・ADC高速なのでノイズの影響を受けやすい&ノイズ源が多い(無線や高速なCPU)のでノイズを意識する必要がある
・ADCの読み取り値を正確にするためにユーザー側で2点校正することが推奨されてる(eFuseに書き込む)
以下のURLの内容が理解できれば問題なく使えると思います
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/adc.html
つまり、仕様書の通りに使えば直進性も精度も言われてるほど悪くは無いのですが・・・・ ■ このスレッドは過去ログ倉庫に格納されています