Arduino初心者熱烈大歓迎質問スレ part28
レス数が900を超えています。1000を超えると表示できなくなるよ。
Arduino nano every(ライターATSAMD11D14Aと分離したもの) をPCBAで作りたいと思っています。
https://www.avrfreaks.net/forum/how-burn-firmware-nano-every-bare-pcba-board
よさげな情報がありました。
Nano every:
ATSAMD11D14A bootloader : help to reprogramme D11 firmware;
ATSAMD11D14A firmware : simulate USB device,write arduino sketch to ATMEGA4809.
4809 bootloader : needn't
4809 firmware : any sketch you burn to it through Arduino IDE
という事が書いてありましたが、これって、ATSAMD11D14Aを考えれば、
実装された生の4809にUPDI書込みが可能だという事ですよね。
それで、もしも先人で成功されている人がいらっしゃったら、
真似させてもらおうと思っています。
どなたか、いらっしゃいますか〜? ぷろみにって「スケッチを書き込んでいます」が出た瞬間にリセット押して書き込むのが当たり前だと思ってた。
DTRのない4線のシリアルケーブルしか持ってないから… はんだごてが苦手なので、Seeeduino XIAO の
ピンを30セット分誰かに依頼したいです。。。 やりはじめたら途中で苦手ではなくなると思う。
だから、何かで練習するのがおすすめ。
適性次第で練習してもできない人はいるけどね :-P そしてDQNっぽい奴に暴力で支配され金をせびられる毎日 自分でピンヘッダを何度かやったけど、すっごく汚いんだわ。たまに接触していなかったり。youtube見てると感心するわ。ルーペ付き半田ごて台って初心者にいいかな?宙に浮かせての作業はむしろ難しくなりそうだけど。手先の器用さは普通だお。一応、安い温度設定コテは尼に注文した。
ほんと、誰かにやってほしい。。。 趣味で20年以上安いコテを使っていて、最近温度調整コテ買ったら使いやすくて驚いた
濡らして温度下げて調整しなくていいのでホント楽
はんだ付けで悩んでいる人には救いの神だと思います ホムセンに売ってるような安い温調コテでも十分
適正温度にするだけで全然違うよ
温度はマジ大事 ほうなん?
ハッコーのブースト付きのやつしか使ったことないけどそれとは違うよね。
どんな風に使いやすいん? 最近買ったMEGAの互換機の速度が遅いような気がしたので、
void loop() {
digitalWrite(2, HIGH);
digitalWrite(2, LOW);
}
の速度(周波数)を測ったら、UNO(純正)が112kHz, MEGA2560(互換機)が89kHzで、
やっぱりMEGAの方がUNOより遅いんだけど、これってそういうものなの?
それとも互換機なのがいけないの?
ちなみにTeensy 4.1だと9.8MHz出ました。 あ、loopのオーバーヘッドがあるから
void loop() {
while(1){
digitalWrite(2, HIGH);
digitalWrite(2, LOW);
}
}
とかにしないといけないのか。
それでもやっぱりMegaの方が遅い。 とりあえず今気にしているのはCPUそのものの速度ではなく、
digitalWrite()の速度
です。
で、いろいろググったら知りたかったことが書いてあるブログにたどり着きました。
http://blog.livedoor.jp/prittyparakeet/archives/1061895937.html
やっぱりdigitalWrite()はMEGAの方が遅いということのようです。 >>831
あなたの>>8282,829からそれをエスパーするのは無理だろうね
その速度比べて何の意味があるの?という疑問は別にしても せっかくレスしてくれた人に礼の一言もなく
自分の言い分だけを書きなぐって去っていく
これが美しい国ニッポンのゆとりさんw >>832
どう書けば通じたのでしょうか?
ポートを直に触らずにArduinoの標準のライブラリだけで
I/Oをアクセスするときの性能を知りたかったんだけど
それって意味無いのでしょうか?
Arduinoに関してはは全くの初心者なので、
初心者にわかるように説明していただけるとありがたいです。
(いわゆるコンピュータに関する経験はそれなりにあるので、
一般的な専門用語や概念は説明無しに使っていただいて構いません。) >>833
え?そこまで言われるようなほどのことした? 質問しておいて、本人の意図しない回答だったにしてもなんらかのレスを返すのが一般常識ってことなんでしょ。 >>836
了解しました。以後気をつけます(`・ω・´) >>834
あー、ごめん
君の相手は俺の能力では無理
他の人に聞いて >>838
なんだよ、じゃあ最初から出て来んなよ
(意味:ありがとうございました) >>ID:koz9K3VS
最初質問を読んだときはただ頭が弱いだけかと思ったが
どうやらそれに加えて人間のクズでもあるようだな
相手しなくてよかったな Arduinoのビット数を可変にしたいです。
ArduinoIDEだとF_CPUが定義されてしまうことまでわかったのですが、
F_CPUを定義しないで書き込める方法があったら教えてください。
よろしくお願いいたします。 bit数ってのはマイコンのアーキテクチャで決まってる(Arduinoに乗ってるAVRなら8bit)
そしてF_CPUはクロック周波数であって、今載ってるマイコンのクロック周波数(UNOやNanoなら16MHz)ソフトウェアに教えているだけでbit数とは全く関係ない
マイコンのクロック周波数は普通は決め打ちしておくもの
そもそも基板に搭載されている水晶発振子で物理的にクロックが決まっているので・・・
(UNOやNanoに載っているATmega328Pは分周器を持ってるから半分にしたり1/8にしたりはできるが、それもヒューズビットというプログラムとは違う所の書き換えが必要)
F_CPUは「クロックを設定している」のではなくて『ボードに載ってるマイコンのクロックを教えている』のでハードウェアを何も変更してないのに間違った値にすれば動作がおかしくなるよ >>843
あなたの言う「ビット数」、「可変」ってどういうもの?
壮大な勘違いにならないよう、もうちょっと パソコンみたいにオーバークロックしたいみたいな感じ? >>847
自由にクロックを変えられれば動作スピードとか電力とかいろいろ調整できるんじゃないかと思ったのです。 PCで使われるCPUみたいなことは出来ないかな
動作クロックっていうのは水晶発信器などのクロックジェネレータって部品で
作られた信号の周波数で、これが8MHzだったり16MHzだったりするけど、
基本的に固定値なので周波数を上げ下げできない
発信器の動作クロックは下げられないけど、そのままでは早すぎるって場合には
分周って処理でクロックを間引いたりする
逆に上げたいとき(PCのオーバークロックもこの一種)には、ていばいき(逓倍器)を
使って発信器の周波数を2倍とか3倍とかにして使用する
で、Arduinoは逓倍器を積んでいないので、取り出すデジタル信号の周波数を
下げること出来てもそのままで上げることは出来ないよ serial通信速度もクロック依存、簡単ではないな 省電力なら元々省電力を目的とした機器を選ぶようだと思う 横からだけどatmega328pは4MHzで動かすと1.8ボルトで動くようだが、そうなるとarduinoIDEの範囲外?ボード設定に触れたネット情報がうまく探せなかった
ニッ水二本で動くなんてすごいなあと思ったので試してみたい ATmega328PがいいならMiniCore使えば?
https://github.com/MCUdude/MiniCore
ヒューズビットの設定とかわからん!でもICSPつないでブートローダ書き込みコマンドから内蔵RCで1MHz〜で設定できるでしょ
まぁ1.8Vで使いたいならATmega328Pなんてロートルじゃなくて最新のAVR128DB32とかのほうがいいと思うけどね
まだベータバージョンだけどArduinoCoreもあるし(DxCore)
https://github.com/SpenceKonde/DxCore
AVRDAシリーズは1.8V〜5Vまでの全てのVCC電圧で〜24MHzまで動作保障だよ とりあえず動かすだけなら昇圧させればエネループ1本で5V100mAぐらいまでならいけるんじゃねーの? 思考実験
Arduino自身のI/Oで、チャージポンプ昇圧して
自分の電源をまかなう、なんていうソフトできるんかな? ATmega328Pをを電池2本で動かすとして・・・
内蔵8MHzのクロックを利用するとしてヒューズのCKDIV8は有効にしておく
これでPOR時はクロックプリスケーラが効いてて1MHzだからどんな電圧でも動作する
起動後はタイマーを使ったPWMでDCDCコンバータを駆動(昇圧チョッパーなりチャージポンプ+リニアレギュレータなり)
(バッテリーからの電源にはダイオードを順方向で入れておくこと)昇圧後の電圧は分圧しておいてADCかACで1.1Vの内部基準電圧でモニタ
必要な電圧にまで上昇したらクロックプリスケーラを解除と同時にDCDCコンバータ用のPWMに使ってるタイマーを8分周に変更してメインプログラムへ
で出来るんじゃないかな >>855
こういうのがあったのか、ありがとう
arduino 4mhzで検索してもなかなか出てこなかったので
セラロックつけなくちゃと思っていたけれど内蔵RC発振でも使えるのか
部屋の照明のリモコンを増やしたかったんです。なので少ない電池で動かしたい >>856
待機電力が問題になるかなと思ったけど、待機時はどこも導通してなくてスイッチオンで昇圧回路から起動してブートローダーなしのマイコンも起動すればリモコンとしていけるのかな >>858
すんません、、、
ナバホ語かピダハン語を聞いているような
難しさで理解できませんでした
ガンダムに例えて解説してくれませんかw >>859
内蔵RCは精度が悪くシリアルで文字化けする場合がある
固体毎にOSCCALで調整すると改善するが、
-10℃〜40℃など温度変化の激しい場所では調整し切れない
基本クロック精度が悪いと、タイマーを使うディレイも狂って
周波数カウンタ、IRリモコンなどの用途で問題が発生する場合がある >>862
arduinoを一台arduinoISPとして,atmega328pに直接?書き込んでいるのでシリアル通信できない問題は影響なさそうです
簡易オシロスコープで確認したところ赤外線の38khz も少しずれていたんだけどアイリスオーヤマの LED 照明は認識してくれました
季節による温度変化で駄目になるかもしれないな
低電圧動作を目的に4メガヘルツで動かすならセラロックが必須であれば精度も上がるのかなと思っていました
内蔵 RC 発振でも4メガヘルツで動くようなので挑戦してみます
いろいろありがとう! >>862
そうなんだけど、>>855 のAVR128DB32だと、温度範囲は書いて無いが、ちゃんとキャリブレやってるから、UARTでも大丈夫って書いてあるな
https://github.com/SpenceKonde/DxCore
なんか面白そう >>863
16MHzのクリスタルがついてるとしたら外部水晶用の内部発振回路を全振幅発振器から低電力発信器に切り替えて
かつプリスケーラを4分周に設定すれば何もハードウェア的な改造しなくても水晶の精度で4MHzで動くぞ 追記
内部発振回路を全振幅から低電力に切り替えるのは全振幅発信機がVCC=2.7V〜しか動作が保障されてないため
切り替えはヒューズビットでどうぞ 内部発振回路に種類があったのは知らなかった
どうもありがとう調べてみます >>870
仕様上は7V〜12Vだけど、レギュレータICの発熱考えると、7Vに近い電圧がいい
自分は9Vのアダプタ使ってる 安価な温湿度センサーであるところのDHT11で、気温と湿度を測りたいんですが、何度やってもnanになっちゃって困っています。
以前に使ったときは問題なく使用できたので、プログラムは間違ってないと思います。
VDDは5Vで動かしているのですが、シリアルプロッタで波形を観測したところ、一定の電圧(4V程度)を出力し続けているようです。
DHT11はデジタルのシリアル出力だったはずなので、この時点でおかしいと思うのですが、このような現象に心当たりはないでしょうか
Arduinoを変えたり、DHT11も複数試してみました。
回路が間違えてんじゃないかって思うのですが、データシート通りなのと、以前動いたのが気がかりです。
また、足りないところがあれば、補足するので教えて下さい。 >>872
使用してるライブラリの名前とか配線状況を見れる写真とか動かないコードが有れば回答しやすい
>VDDは5Vで動かしているのですが、シリアルプロッタで波形を観測したところ、一定の電圧(4V程度)を出力し続けているようです。
>DHT11はデジタルのシリアル出力だったはずなので、この時点でおかしいと思うのですが、このような現象に心当たりはないでしょうか
うちのDHT11のSIGNAL(2番)をテスターで測ったら4.95Vだった(VDDは5.05V) ちょっとおかしいですね
これは外部のプルアップを使わずマイコンの内蔵プルアップを使用してでの電圧です
配線の不良も疑ってみては? Arduinoのdigital outを別の機器に繋ぎたいです
その機器は独自の電源を持っています
Arduinoと供に使う何とかCAPのようなArduinoから給電する機器ではありません
その機器のdigital inの回路がその機器の5V電源にプルアップしています
このような接続形態の機器にArduinoのdigital outを繋げますか?
なお流れる電流は0.5mAです
Arduinoのdigital入出力のピン1本とGNDのピンをその機器に繋ぐだけで良いのでしょうか? >>874
問題無い
というか殆どの装置は入力保護でプルダウンかプルアップしてると思う
自作装置もそうするほうが良い >>875
ありがとうございました
でも理解できない事があります
Arduinoで外付けのLEDをLチカさせる時にArduinoのGNDピンと13番ピンの間に抵抗器とLEDを入れます
Arduinoの5V端子、13番ピン、GNDピンの3つを使うような記事を見た事がありません
これは13番ピンとGNDピンの間が解放か短絡か2択のリレーみたいなスイッチになっておらずArduinoの内部でGNDと13番ピンの間が5V電源に繋がっているという事ですよね?
Arduino側でArduinoの5V電源にプルアップ、別の機器側でもその機器の5V電源にプルアップでは不味くないですか? これを読んでも良くわからないので質問させて頂きました
ソースとしてもシンクとしても使えると書いてありますがOUTPUTに指定するピンに対しソース、シンクのどちらにするのかスケッチで指定する方法が書かれていません
outputに使うピンのソース、シンクどちらにするかのスケッチでの指定は無いと思えば良いですか?
http://www.musashinodenpa.com/arduino/ref/index.php?f=2&pos=83
【OUTPUTに設定されたピン】
ATmegaのピンはソース(正の電流源)としても、シンク(負の電流源)としても機能し、 あなたが想像する回路図を描いてミソ
Aruduinoの電源と相手機器の電源が互いのプルアップ抵抗でつながるのってまずいのでは?ってこと? それなら
HIGH出力でソース
LOW出力でシンクです >>877
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);//Source
digitalWrite(pin, LOW);//Sink DUEのDAC0, DAC1にアナログ信号を出力するにあたり、
analogWrite(DAC0, value);
の代わりにポートレジスタを直接叩くようなことは出来ますでしょうか?
出来るとしたらどのようにすればいいか教えていただけるとありがたいです。
デジタル出力だと、例えばdigitalWrite(5, HIGH); の代わりに
PIOC->PIO_SODR |= (1<<25);
にするみたいなやつです。 すでに出力設定とか全部してあって値だけ変えるって話ならDAC0かDAC1のDACC_CDR ごめん違ったDACCのDACC_CDRで良いわ
ビット位置で0と1だわこれ >>882-883
ありがとうございます。
チャンネルの選択方法がまだいまいちわからず、
DAC1に出力することしか出来ていないのですが、
とりあえず25倍ぐらい速くなりました。 >>884の続きです。下記の手順で両チャンネンルに出力できました。
1chあたり0.8Msa/sと、ほぼハードスペック(1Msa/s)通りになりました。
analogWrite()をあらためて測ったところ、0.13Msa/sぐらいは出ているで、
昨日の25倍というのは気のせいで、6〜7倍ぐらいのようでした。
アドバイスありがとうございました。
analogWrite(DAC0, 0);
analogWrite(DAC1, 0);
でとりあえず初期化。
書き込みモードの設定
DACC->DACC_MR |= bit(4)|bit(20); // Word transfer mode(bit4), Tag mode(bit20)
書き込み
DACC->DACC_CDR = x | (y<<16)| bit(28); // CDR[15:12] is CH for CDR[11:0], CDR[31:28] is CH for CDR[27:16] Arduino Nanoで入力ピンの割り込み処理を行わせるプログラムを以下のように書いているのですが、割り込みの初期化時に必ず1回割り込みが発生してしまいます。
pinMode(2, INPUT_PULLUP);
attachInterrupt(0, func, CHANGE);
どうも、割り込み判定の初期値がLOWになっているようで、INPUT_PULLUPのようにHIGHを初期状態にした上で
割り込み判定をCHANGEやRISINGにすると、それをLOW→HIGHと判定してしまうようです。
(FALLINGでは発生しませんし、
pinModeのあとにdelayを入れても変わりませんので安定の問題でもないようです)
割り込み判定の初期値をHIGHにすることはできないでしょうか? プルアップならFallingで割り込みでいいんじゃないの AVRの割り込みは割り込みが無効の間も判定は常に行っていて有効になった瞬間に実行される
(じゃないと割り込み停止中に割り込み条件が満たされたことが検知不可能になるため)
それが嫌なら有効にする直前に自分で割り込みフラグを消せ
EIFR = 0x03;
で消せる(Nano、Unoの外部割込みの場合) >>888
それとこれとは話が別
ChangeにしてるってことはLowにしばらく引いた後Highに戻すときも拾いたいってことでしょ
Lowに引くときだけ割り込みたいわけじゃないのだろう じゃあ普通に割り込み条件整ってるんでしょ
割り込み用のピンになに繋いでるのかな >>889
EFIRは割り込みのマスクレジスタなんですね。
attachInterrupt前にEFIR=0x03することで回避できました。
AVRでの割り込み動作についても理解しました。
ありがとうございました。 >>891
ピンに何も繋がず、INPUT_PULLUPでHIGHに固定した状態で、attachInterupt(CHANGEまたはRISING)した時点で割り込みが発生していました。
INPUT_PULLUPした瞬間にピンはHIGHになっていることは確認しています。 >>891
上でも書いたけど割り込みは無効の間も「割り込みフラグレジスタ」に記録される
無効状態でも割り込み条件を1回でも満たしていれ次に有効にした瞬間に割り込みが実行される >>892
マスクレジスタはEIMSK
EIFRはフラグレジスタ >>889
昨日割り込みについて質問した者です。
その延長で教えて欲しいことがあるのですが、
割り込み判定を"CHANGE"にした場合に、立ち上がりなのか立ち下がりなのかを正確に取得する方法ってあるのでしょうか?
割り込み直後にピンの状態を取得しても、ものすごく短いパスルのような場合は割り込み時とは異なる状態が取得されてしまいました。
あらかじめ過去の状態を変数に保管しておいて、という方法ならその反対に変わったと判断できますか、これも処理が追いつかないと正確ではなくなりそうです。
トリガー情報が呼び出された関数の引数で受けられたりしたらベストなのですがそのようなものは無いですよね? >>897
Low用とHigh用で2ピン使ってはどうかな
だけど そもそもCPUの処理速度が追いついてない様なので
意味がないかもね 1ピンでやるならカウンターをインクリメントしていって
0ビット目を調べるっていうのもあるね
ただどっちにしろ速度が間に合ってないっぽいけど >>897
タイマーを外部クロック入力にして割り込み直後に前回値と比較すれば
Hi/Low/取りこぼしerrのステータス返す事ができるよ
1/2クロックまで、16MHzなら8MHzまで
それ以上のものすごく短いパスルはどうあがいても無理 Cで書いたら割り込みはISRマクロで定義することになって、NAKED付けない限りr0とr1と割り込みルーチン内で使ってるレジスタのPUSHが入るし
そもそも該当の信号が同期化されて割り込みベクタに飛んでRJMP命令が実行される時点で4クロック分の時間を消費してるわけで・・・
Arduinoで書いてるなら使うレジスタを全部把握してISRにNAKEDつけて退避なしで組むとかほぼ不可能だと思うし
16MHzでやるには辛い仕様なんじゃないの。実際どういう目的で使ってどういう信号が来てるのか書いてみてよ どうあがいても無理と書いたけどあれは嘘だ
外部クロック注入前に74HC4040等で文周すれば80Mhzくらいまでいける
「ごく短いパルス」というのがふんわりしすぎていて仕様を満たしているかわからん 外部部品OKなら外付けで何でもできるだろw
パルスカウント用に高速のマイコンつけりゃいいだけだし >>897
割り込みトリガをトグルするとかどうかな
始めRisingでトリガして呼ばれたらFallingに変える
Fallingで呼ばれたらRisingに変える 外部割り込みピンでもピン変化割り込みは使える、かつ同時にフラグが立ったときは割り込みベクタ番号の若い方、つまり外部割込みが優先して実行されるから
両方有効にして外部割込みはRISINGのみにする、外部割込み直後にピン変化割り込みのフラグを解除する行を追加
これで擬似的にRISINGは外部割込み、FALLINGはピン変化割り込みのISRになる・・・かな
まぁどっちにしろ信号の早さに対してマイコンのクロックが足りてないっぽいのでどんな手段をとろうが取りこぼしが起きるだろうけど ノイズに付き合う必要も無いので短すぎるパルスは切り捨てる判断も必要 返信が遅くなりすみません。いろいろとアドバイスありがとうございました。
今回の(CHANGEでのRISING/FALLING判定)は具体的な利用のものではなく、前回の延長としてそういったことはできないか、という意図でした。なので非現実的なことを聞いてしまったかもしれずすみません。
CHANGEでの割り込みで、関数の最初にHIGH/LOWを見てRISINGかFALLINGか判定した上で、それぞれカウントするという簡単なコードで試した際、タクトスイッチのチャタリングのような細かい周期の割り込みでは正確に拾えなかったことから質問させていただいた次第です。
(RISINGとFALLINGのカウントは常に1しか差が出ないはずがそうではなかったため)
電子工作は初心者で、ソフトウェア寄りな人間なので確実な方法を求めてしまいました。
ソフトウェアでの限界はある程度はあきらめることや、周辺回路でサポートすることも必要ということですね。いろいろと勉強になります。 人間の手では50ms以上の速度でタクトスイッチを押すことは高橋名人でも不可能なので
50ms未満の変化はソフトウェア的に無視するよう書くべき >>909
16連射ならデューティ50%としてON(OFF)時間は31.25msecだから高橋名人なら可能なんじゃね
実際には16連射より速かったそうだし makeして書き込めと言われたのですが、makeとは何でしょうか?
ArduinoIDEで出来かすか? makeとはソース(スケッチなど)をコンパイルリンクして実行ファイル(機械語HEXファイルなど)を作成すること
ArduinoのスケッチならArduinoIDEで可能、素のAVRのソースならAtmel Studioなどに読み込んでコンパイルリンク、Makefileが付いてるならgccとかで一気にできるんじゃない? >>909
連射は難しいけど、単発で1回押すだけなら20msぐらい余裕だよ。
意図的に短いパルス出そうとして頑張れば10msぐらいでもいける。 レス数が900を超えています。1000を超えると表示できなくなるよ。