Arduino初心者熱烈大歓迎質問スレ part30
■ このスレッドは過去ログ倉庫に格納されています
>>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
つまり、仕様書の通りに使えば直進性も精度も言われてるほど悪くは無いのですが・・・・ 発振といえば未だにLC発振のリクツを理解していません
どうやら僕がやっているのは電子工作ではなくただのマイコンプログラミングのようです
KiCADで回路図をしたためつつそんなことに気づいた日曜の昼下がり
現場からは以上です >>749
ありがとうございます…
これは製造ロットによってADC電圧にバラつきがあるという
例のアレですね… 測定でアナログ必須になるのでなんとか
頑張ってトライしてみます! >>745,746
ありがとうございます。
負荷容量をキーワードに検索し、よくわかりました。水晶ごとに発振周波数の前提にしている負荷容量があること、外付けする容量ではなくICや実装時に結果的に発生する容量も込みであること(当たり前といえば当たり前ですが)。ゼロに近くなると周波数双曲線的に高くなることなど理解しました。 esp32のADCの歪みにより具体的にどんな時にトラブルが発生しますか? 補正を考えずに意味もわからずなんかのスケッチそのままコピーして思い通りに動かない人がesp32のADCは使えないと吹聴する >>754
なるほど
そこまでできててなんでそんな事が分からないのかなと思ってた
そうなんだね ESP32のADCの0V付近のオフセットはソフトではどうしようもなかったような。アナログセンサー入力とかだと影響がでる。 arduinoってPythonでもプログラムできるんだね 教えをこうむりたく。。。
下記のとおりです。。。
よろしくお願いいたします。
◇やりたいこと
inoとは別ファイルで関数を作成しその中でU8x8lib.hを使いOLEDのテキスト表示をしたい。
◇問題点
別ファイルにおけるコンパイルエラー
◇エラーの内容
'u8x8' does not name a type
u8x8.begin();
^~~~
◇状況
inoファイルの setup()関数の中や、loop()関数の中に
u8x8.****** を記述するとうまく行きます。
Auduino IDE で別ファイルを作成して、そこにはsetup()関数が
ないので、自作の関数の中で、u8x8.***** を呼び出そうとしました。
====== 別ファイル(*.cpp)のコード(エラーが出たコード)======
#include <Arduino.h>
#include <U8x8lib.h>
....
void 関数名(void){
U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
u8x8.begin();
u8x8.clear();
u8x8.setFont(u8x8_font_7x14_1x2_r);
u8x8.drawString(0,0,ABCDEF);
}
※inoで一つのファイルに記述するとエラーは出ない
====== ****.inoのコード ======
#include <Arduino.h>
#include <U8x8lib.h>
U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
....
void setup(void) {
u8g2.begin();
u8x8.clear();
u8x8.setFont(u8x8_font_7x14_1x2_r);
u8x8.drawString(0,0,ABCDEF);
} 大変お騒がせしました!!
下記にてコンパイラ通りました。
今晩、やっと寝れそうです。
ino本体
#include <U8x8lib.h> ←消去
本体ではライブラリは一切さわらない
C++ 追加ファイル
#include <Arduino.h>
#include <U8x8lib.h>
U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
void 関数名(void){
u8x8.begin();
u8x8.clear();
u8x8.setFont(u8x8_font_7x14_1x2_r);
u8x8.drawString(0,0,ABCDEF);
}
ちなみに、ググる場合のキーワードは「ソースコード 分割 ライブラリ 呼び出し」
で、色々な情報が出てきました。
ただ、今回のU8x8libライブラリを自作C++で呼び出す方法は自分では探せなかったです。 void 関数名(void){
を
void 関数名(U8X8_SH1106_128X64_NONAME_HW_I2C u8x8){
に変更
メインファイルの
関数名();
を
関数名(u8x8);
に変更 同じディレクトリのソースのインクルードファイルをインクルードするときは
#include "U8x8lib.h"
じゃなかったっけ? ちなみにArduino IDEは自前ソースの同じディレクトリのヘッダーファイルのincludeは
#include "foo.h"
としないとエラーが出るけど
Platform IO IDEならどちらでも#include <foo.h>でエラーは出ない U8x8lib.h は、外部ライブラリだよ。
U8g2 に付随する簡易版の OLEDライブラリ。
質問者が U8g2ライブラリ作者なら話しは別だが。。。w LeonardoとPromicro(5v)のブートローダーって機能的に違うところとかってある? >>768
ProMicroのブートローダーにLeonardoのブートローダー焼いて使って
いるのでIDEにSparkFANの環境入れなくても使えてる
実質的には違うデバイスとして見えるくらいじゃないのかな atmega32u4を自作基板に組み込みたいんだけど、どのarduinoのブートローダーがいいのかなって気になった。みんなありがとう
今icspでブートローダーまで書き込んだけど、usbから上手く書き込み出来ないや。デバイスマネージャにデバイスは現れるけど、不明と表示が出る。書き込み自に色々なタイミングでリセットしてもダメ。 初心者熱烈歓迎スレでそんな嫌味を言ってどうするの? >>772
ありきたりだけどUSBハブとか延長ケーブルとか使ってない? >>774
本人が>>1に書いてある情報すら収集できてないっていう渾身のボケなんやない? ATmega32u4と、USBコネクタの間の配線が適切ではない、とかあるかな? v-busは5vと共通、D+とD-は両方22Ω抵抗を介してマイコンへ繋いでます。後はGND位ですね。クリスタルは16Mのセラロックを使用しました。 >>775
もちろん使ってない。
取り敢えず回路の見直しとケーブル変更、pc指し口変更もやってみる >>772
デバイスマネージャにデバイスのエントリが表示されるけど不明って出るって、
黄色いビックリマークが出てるって事かな?
だとしたら32u4が使用するドライバが見つからないってことだから、SparkFAN
なりLeonardoなりのブートローダに対応したデバイスドライバを導入しないと
ダメでないかな 電気的に逸脱したところがあると、認識は始まるけれど、ちゃんと認識できずに不明な
デバイスになることがあります。
電源が弱いとか、GNDを含めたケーブル接続が弱いとかも。
USBは本来は、クロック周波数の要求が厳しくて、セラミック振動子だと、それなりに
精度が高いものでないと動作保証ができないことがありました。(水晶の方が高精度)
今のUSBデバイスは、いろいろ工夫されていて、ホストのクロックに合わせるみたいな
しくみもありますが、32U4はそういう意味では昔のデバイスだと思います。
俺が持ってるUNO3は、本体はセラミックなのに、USB I/Fの方は水晶だし、
Leonardo は水晶を使ってます。
まだ解決してないようなら、水晶も検討してみて。 例えば1つのnanoからもう一つのnanoへUSBコネクタ介して通信するにはどうすればよいのでしょうか?
TxピンとRxピンつないでの通信は理解していますが、物理的制約でできればインターフェースはUSBコネクタだけにしたいんです。
間にPCを挟めばよいのも分かっていますがそれは無しで。
因みにダメ元でUSBのそれぞれのピン同士つないでみましたがだめでした。D+/D-逆につなげば良いってんでも無いですよね? USBはホストとデバイスでめちゃくちゃ違ってホストするのは結構大変なんや
USBに接続するデバイスはそれなりにラクだけどUSBが接続されるデバイスを作るのは10倍以上大変なので
その認識程度の場合はそんな接続はほぼ出来ないと思っていい >>783
ですよね、、USB1.1だけに絞ればと思ったりしましたが。
Mini USB Host Shield で検索して出てくるモジュールを使うと多少高いが行けるかなと、、試してみます。既に試された方アドバイス頂ければ幸いです。 USBアナライザみたいなの作りたいのかもな
まあラジオ2台あるけどトランシーバーできますかみたいな感じ 初心者だから流れが分からない
簡単に流れ教えて
あとI2Cなら楽なの? 基板のUSBコネクタはシリアル―USB変換が入ってるから途中でUSBホスト機器が必要。USBケーブルを通信に使うにしてもピンからシリアルかi2cを引き出して繋げば外部機器は不要でarduino同士接続可能。 >>786
物理的制約と明記しました。
既に筐体に入っていてUSBコネクタだけアクセスできるnanoとシリアル通信したい。筐体に穴を開ければ普通につなげることはわかっている。 ホスト機能を持ったマイコンに仲介してもらうしかない nanoやめてprominiにすれば設置スペース的には解決
つか無駄なもん付いてるnanoを組み込む理由がわからん >>792
既にできちゃってるものに何とかしようとしているから物理的制約があるんだとなぜわからんのか、わからん >>794
チップの機能的にはできるけどライブラリにUSB-UARTのドライバはないからUSB-UARTチップ(CH340か?)のドライバをフルスクラッチで書けないとできないぞ・・・ 既にできちゃってるっていっても失敗作は未完成と同じ 筐体を変えたくなけりゃあUSBホストシールド使っても無意味じゃん
USBコネクタの通信線切り離してI2Cに繋ぐのがいちばん楽なのでは >>797
いや違うんじゃね?
Nanoが埋め込まれた機器(構造変更不可、USBだけ出ている)があってそれに対してコミュニケーションをとるデバイスを作りたいが
NanoからはUSBしか出てないのでUSBホスト機能を持ったデバイスを作らなければならない(これから作るので構造は自由)
ってハナシだと思っているが 改造を加えるなら
nanoのusbコネクタ撤去しちゃえばI2Cの線2本くらい楽に出せるのでは? 中身いじるのは駄目っぽいからUSBホスト付きの中継機器作るしかないね。 元々はどういう機器なんだろ。PCに繋いで専用ソフトで機器同士のシリアル通信をバイパスしてるとか? >>781
水晶にしてみたけど、変わらなかった。
何か別の問題の様子。
ケーブルを変えたり、回路を見直してみます。 nanoが挿してあるんだから原状復帰も楽ちんなはず >>796
最初の仕様は満たしていて、後でこういう事もできないかなと言うような追加案件が持ち上がったことはありませんか? >>781
解決した。
6pinのUCAPに1uFのコンデンサを介してGNDへ繋いだら、レオナルドヲ認識して書き込みまで出来た。
試しにセラロックに戻して書き込みしてみたけど、成功した。でもこれからはクリスタルで運用しようと思う。
これでusbでスマートに書き込み出来る機器を作れるよ。
アドバイスありがとうございました。 ホストの方がこれから自由自在に作れるなら、なんなっとできそう。 >>780
win10はドライバー要らないみたい。
今回はコンデンサ着けたら認識してleonaldと表示出た。
解決しました〜 >>809
おめでとさん!
セラロックは関係なかったか。
ところでUCAPって何だったっけ? Arduino uno3とnanoはどういうものかと言うのがわかるのですが
それ以外で何がどう違うのかがわかりません
大体これくらいは覚えておけ〜位の事が知りたいです >>813
例えばleonardoとかMegaとか >>813
いろいろな種類のボードの違いをここに書くのは答える方も大変。
疑問のキーワードをgoogleに放り込んだらどうでしょ。
arduino 種類 違い
で、ぐぐったら、こんなページが出てきたよ。
https://spiceman.jp/arduino-edition/
ここに書かれてあることで、わからないことがあれば、話題にしてみては。 >>808
議論をしたくない、聞く耳を持たないやつは質問なんかしてないで
自力で解決すれば良い。
こんなスレもあるよ。
理論より答えだけがほしい質問スレ
http://rio2016.5ch.net/test/read.cgi/denki/1472870723/ >>795
ありがとうございます。ダメモトで試してみます。
因みにミニUSBホストシールドよりuniサイズのUSBホストシールドの方がまともそうです。 AVRのArduinoでSRAMが足りなくなった場合、みんな何使ってます? ■ このスレッドは過去ログ倉庫に格納されています