Arduino初心者熱烈大歓迎質問スレ part26
レス数が1000を超えています。これ以上書き込みはできません。
>>948
OSがメモリマネジメントしてないから
現代的OSとアプリの関係ではなくDOSアプリ作るようなもんだけど、若者にはイメージ伝わらないよね >>953
メイン
・lcdtime>30 で表示処理
・表示終わったらlcdtime=0
通信など
ループ
割り込み 0.1秒
・lcdtime++
・モーター作動ならmotertime++
・motertime>300 ならモーター停止
・モーター作動処理
割り込み使うまでも無いレベルだが、やるとすればこんな感じ 初心者です
質問があります
Leonardo のリセットボタンを押してもLのledが一切光らないのは異常ですか?
Boorloaderの異常ではないかと公式サイトにあったのですが、先日買ったときからこの調子です
書き込もうとしても、コンパイル後に書き込み開始されるとcomポートが認識されなくなります。書き込みまでは正常で、書き込み開始後にデバイスマネージャーから突然消えます。
ポートやボードの設定は合ってます。
書き込み前にリセットボタンを押しておいて、書き込み開始後に離すことで認識させることはできたのですが、いざ書き込もうとしてもprogrammer is not respondingとなり、一切スケッチが書き込めません。
買ってから一度も使えておらず、返品を考えています。ご教授願います。 >>953
3秒毎に表示、3分毎に送信ってのは
マイコンにしてみたら手持無沙汰もいいとこ
暇で暇で鼻くそほじってるわw >割り込みだとメインループを中断して割り込んでしまうので…
>あっ…実は割り込み使ったことないんです…
>使ったことないので先入観で出来ないと思っちゃったのかな…
>うーんやっぱりマルチタスクっぽい動作は無理なのかな…
何だコイツ? >>952
はい…僕もその認識で 割り込みが入ったらメインループは
一時停止で割り込みの処理が終わったら再開だと思ってたんですが… >>952 >>961
それであってる。
マルチコアとかの特殊なアーキテクチャーでなければ、CPUは普通は1つの命令しか同時には実行できない。
複数の処理が平行に途切れなく実行されてるように見えるかどうかはプログラムの工夫にかかっている。 >>961
どういうタイミングで何がやりたいかフローチャートにでも書いてから出直して
それ無しに何を語っても無意味 >>964
割り込み無しで簡略化して書いてみます
int val = sensor.value;
int total_val = 0;
void loop() {
lcd.print(val);
total_val += val;
delay(3000);
if (total_val > 100) { // センサー値合計が100を超えたら…
digitalWrite(2, HIGH); // 30秒間モーターをONしたい
***ここで30秒間モーターを動かし終わるまで待たずに
回しっぱなしでloopの頭に戻りたい そして30秒後に
自動的にモーターは停止したい***
と、書いていて気づいたのですがモーター回転中もセンサー合計値が
蓄積していくとすぐにまたif文に掛かりそうで ループを一時中断したほうが
都合がいいのかもしれないと思い始めました… >>966
割込み有りで書いてみ、即座に解決するから >>ID:dtY8+1+8
タイマー割込みだと言われてもそれについて調べもしないから
あなたの場合は回答もらっても無意味だね https://www.aliexpress.com/item/32820135156.html
これ買ったけど
AT+TYPEが0だったのでAT+TYPE3って送信したら
AT+TYPE=0
OK
って返ってきて全然OKじゃないんだけど!! うーん…タイマー割り込み調べて>>962さんと
同じ結論に至って無理そうかなって聞いてみたのに…(´;ω;`) >>966
digitalWriteでポートをオンにしたらオフにするまでそのまま保持するはずだが? >>971
理解するのが難しいかねえタイマー割込みは
メインの処理は同時には出来ないけど数のカウントは同時に複数できてそれがタイマー
既定の数数え終わったら終わりましぜって教えてくれるのが割込み
教えてもらったらモーター止めるのはメインの処理 delay(3000)なんて使わずにmillisで時間を確認し経過時間に応じてif文で処理すれば良いんじゃねーの
割込み使っても良いけど あと割り込みの使い方として、懸念されてる様に割り込み中はループが止まるから
割り込みの中ではフラグを立てたりしたらすぐ復帰する様にして、本処理は
ループの方で割り込みのフラグが立ってたらと処理する タイマー割込みならモーター始動と同時にタイマースタートして割込み関数でモーター停止とタイマーストップすれば出来るだろうし
MsTimer2というライブラリがある 横で済まないが
タイミング的に絶対割込みさせたくない部分では
禁止にする方法とか
それが済んだら割込み処理とかってできる? delayは使いたそうだからライブラリではTimerOneとMsTimer2
モーターがサーボなんだかPWMなんだかわからなかったけど
ただぶん回すだけみたいだからどっち使ってもいいね >>977
タイマー止めればいい
割込み禁止も可能 >>977
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=3155
割り込みを禁止すると割り込みで動作している動作は一切止まるので注意(うっかりdelayとか使うと戻って来なくなるぞ)。 あごめん、戻って来なくなるんじゃなくディレイが無くなるようだ(即戻る)。 AT+TYPE1は設定できることを発見した
でもペアリングは無理っぽい ああ…たくさんヒントありがとうございます…
なんとなく流れが理解できました
頑張ってみます! なんとなく結論出てるみたいだけど
まず、基本的にArduinoではWindowsやLinuxみたいなマルチスレッドみたいな機能は無い
なので、自分でスレッドスケジューラみたいな仕組みを作る必要がある
でも本格的にスレッドの仕組みなんか作ると大変だしプログラム容量も大きくなるので
実行したい処理と処理にかかる時間を定義して、各々の処理をどのタイミングで実行
するかを決めたタイミングチャートを作って一連の処理を行うループを作成するってのが
屁理屈なんだけど
一応「arduino マルチスレッド」でググると色々出てくるし
http://asukiaaa.blogspot.com/2016/06/arduino.html
見たいな例もあるみたいよ 割り込み中ではフラグだけ立てて、メインでフラグをチェックして処理 >>991
やっぱ、Arduinoでもそんな感じですかね〜
>>992
一般的にって事です。 >>990
自分じゃ何も調べずに適当な質問を数撃ちゃ当たる方式で投げてるだけだろコイツ >>996
そうね
きっとコイツ >>903、>>912 だと思うわ
荒らしは相手にしないのが一番 >>991の回答も意味不明なんだが
会話が成り立ってるところがまた笑える。 >>998
>>991の回答が解らないとはあんたは割込処理中にどんな記述してるんだ?
割込処理内ではフラグだけ立ててメインループでポーリングしてフラグ監視するのは基本じゃね
スタックやリソースの競合や多重割込のことを考えると
割込処理内で複雑なことするとデバッグするのが大変だろうに このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 71日 5時間 0分 52秒 レス数が1000を超えています。これ以上書き込みはできません。