Arduino 3) 頻繁に起きる再起動を探る
2016.11.19
今使っているArduinoUNO R3
使い始めたころから、突然再起動がかかるのです。
なにぶん、何も知らないところからのスタートなので、
これも仕様通りなのだろうと思っていました。
例えば、
void setup(){} に試験的なコードを書き、
void loop(){} の部分を空欄にしておくと、
setupに記述した処理を終えた後
何も動かすコードがないので、一定時間過ぎた後再起動するのでは?
なんて無知ゆえ甘いことを考えていたのです。
ところがloopに、1秒ごとカウントするコードを書いて、
永遠に終わらない処理をさせてみたところ
不定期に再起動が起きることを確認しました。
つまりプログラム的なものではないな・・と
PCのUSBポートから給電させて動かしているのですが、
PC側のArduinoIDE又はドライバが定期的に再起動信号を送っているのか?
なんてことも考えたわけですが、事態は簡単に解決いたしました。
外部給電ソケット端子に、9V角形乾電池を接続すると症状は再現しませんでした。
あと、別のPCに接続してみても症状は再現しませんでした。
つまりは、私のPCのUSBで電力を十分に供給できていないということのようです。
結構デリケートなのね。LCDが思った以上に食うのかしら?
ではUSB接続しながら外部電源を接続した場合はどうなるのか?
ダブル電源カッケー!なんて中二病みたいな事にはならないようです。
外部電源端子に推奨されているのは7V~12V
7V以上外部から供給された時点でUSB給電を止め外部電源に切り替わるようだ。
外部から7V以上入れても、
三端子レギュレータで5Vに減圧されて使われるので問題ない。安定は9Vと言われているようで、多少熱はでるが12Vでも問題ないという話。
ということで手軽に実験するのであれば、
十分に電力を供給できるUSBポートを使うか、
9Vのアダプタ又は乾電池を使う必要がある。
使い始めたころから、突然再起動がかかるのです。
なにぶん、何も知らないところからのスタートなので、
これも仕様通りなのだろうと思っていました。
例えば、
void setup(){} に試験的なコードを書き、
void loop(){} の部分を空欄にしておくと、
setupに記述した処理を終えた後
何も動かすコードがないので、一定時間過ぎた後再起動するのでは?
なんて無知ゆえ甘いことを考えていたのです。
ところがloopに、1秒ごとカウントするコードを書いて、
永遠に終わらない処理をさせてみたところ
不定期に再起動が起きることを確認しました。
つまりプログラム的なものではないな・・と
PCのUSBポートから給電させて動かしているのですが、
PC側のArduinoIDE又はドライバが定期的に再起動信号を送っているのか?
なんてことも考えたわけですが、事態は簡単に解決いたしました。
外部給電ソケット端子に、9V角形乾電池を接続すると症状は再現しませんでした。
あと、別のPCに接続してみても症状は再現しませんでした。
つまりは、私のPCのUSBで電力を十分に供給できていないということのようです。
結構デリケートなのね。LCDが思った以上に食うのかしら?
ではUSB接続しながら外部電源を接続した場合はどうなるのか?
ダブル電源カッケー!なんて中二病みたいな事にはならないようです。
外部電源端子に推奨されているのは7V~12V
7V以上外部から供給された時点でUSB給電を止め外部電源に切り替わるようだ。
外部から7V以上入れても、
三端子レギュレータで5Vに減圧されて使われるので問題ない。安定は9Vと言われているようで、多少熱はでるが12Vでも問題ないという話。
ということで手軽に実験するのであれば、
十分に電力を供給できるUSBポートを使うか、
9Vのアダプタ又は乾電池を使う必要がある。
Arduino 2) 数値を文字として表示する
2016.11.17
プログラムを作っていると内部数値を
表に出したいことがよくあります。
バグの追跡などでは大活躍です。
Arduinoではセンサーの値を表示するなど頻繁に使うと思います。
私がよく使う言語ではinttostrのような数値を文字に変換する関数
を使ってから出力します。
ところが先日行ったLCD出力のコードを応用しますと、
lcd.print(65536);
このように実行しても問題なく表示されちゃうんですね・・・
ちょっと目からウロコw
int a;
a=65536;
lcd.print(a);
こうするとintの制限を受けて上手に表示されない。
ArduinoUNOのintは-32768から32767なのだ。
ArduinoDueなら-2147483648から2147483647までいけるらしい。
では以下のコードではどう示すか実験
int a,b;
a=32767;b=32767;
lcd.print(a+b);
結果 -2
int変数同士が足し算を行った場合は、
結果もintとして処理されてしまうようだ。
(正確には狂っているわけじゃなく2の補数計算されているだけですが)
負の値はいらないよ。って場合は、
unsigned int a,b;
a=32767;b=32767;
lcd.print(a+b);
結果 65534
正しい結果が導かれた。
unsigned intは整数のみを扱い、0~65535を扱えるっぽい。
チマチマしたことはどうでもいいって場合は
longを使うと-2,147,483,648から2,147,483,647まで扱える。
ではintとunsigned intの変数を足したらどういった結果になるのだろうか。
高級言語だと、型が合わないとか言ってコンパイラが弾くのだが・・
int a
unsigned int b
a=32767;b=32767;
lcd.print(a+b);
結果 65534
弾かないw 結果も正常。実に興味深いw
どうやら、サイズの大きい変数に合わせて計算されているようだ。
では、これではどうだろう。
int a
long b
a=32767;b=2000000000;
lcd.print(a+b);
結果 200003277
これも大きいサイズの変数に合わせて計算された。
強い物に巻かれろ主義( ´艸`)
こういったことは言語やCPUレジスタの特徴に大きく左右されるので、
一度実験しておくと今後悩まずにコードが書けるはず。
忘れっぽい私にはとても重要なことなのです。
表に出したいことがよくあります。
バグの追跡などでは大活躍です。
Arduinoではセンサーの値を表示するなど頻繁に使うと思います。
私がよく使う言語ではinttostrのような数値を文字に変換する関数
を使ってから出力します。
ところが先日行ったLCD出力のコードを応用しますと、
lcd.print(65536);
このように実行しても問題なく表示されちゃうんですね・・・
ちょっと目からウロコw
int a;
a=65536;
lcd.print(a);
こうするとintの制限を受けて上手に表示されない。
ArduinoUNOのintは-32768から32767なのだ。
ArduinoDueなら-2147483648から2147483647までいけるらしい。
では以下のコードではどう示すか実験
int a,b;
a=32767;b=32767;
lcd.print(a+b);
結果 -2
int変数同士が足し算を行った場合は、
結果もintとして処理されてしまうようだ。
(正確には狂っているわけじゃなく2の補数計算されているだけですが)
負の値はいらないよ。って場合は、
unsigned int a,b;
a=32767;b=32767;
lcd.print(a+b);
結果 65534
正しい結果が導かれた。
unsigned intは整数のみを扱い、0~65535を扱えるっぽい。
チマチマしたことはどうでもいいって場合は
longを使うと-2,147,483,648から2,147,483,647まで扱える。
ではintとunsigned intの変数を足したらどういった結果になるのだろうか。
高級言語だと、型が合わないとか言ってコンパイラが弾くのだが・・
int a
unsigned int b
a=32767;b=32767;
lcd.print(a+b);
結果 65534
弾かないw 結果も正常。実に興味深いw
どうやら、サイズの大きい変数に合わせて計算されているようだ。
では、これではどうだろう。
int a
long b
a=32767;b=2000000000;
lcd.print(a+b);
結果 200003277
これも大きいサイズの変数に合わせて計算された。
強い物に巻かれろ主義( ´艸`)
こういったことは言語やCPUレジスタの特徴に大きく左右されるので、
一度実験しておくと今後悩まずにコードが書けるはず。
忘れっぽい私にはとても重要なことなのです。
3D-PRT30)ABSのフィラメントにチャレンジしてみた
2016.11.16
いままで必要な部品をPLAで印刷してきたのですが
いよいよ熱による強度変化に問題がでてくることが多くなり、
ABSに乗り出すしかない状況になってきました。
ヒートベッドは85度くらいまでしか上がらないので、
自信がなかったのですが、問題という問題はまったく起きず
キレイに印刷されちゃいましたよ。
1層目が240度、2層目以降は225度に温度を設定しています。
0.05mm積層ですが、1層目は130%にしてますので少し厚みがあります。
1回目のテスト印刷では逆にガラス面に強固にくっつきすぎて、
無理にはがそうとしたらレイヤー1層目が本体から剥離してしまい
壊れてしまいました。PLAではこんなことなかったんですがねぇ・・・
下の写真は2回目に印刷したものです。


左が表、右が裏。
文字もはっきり印刷されていて、PLAのときより鮮明です。
上面の層をもう一層増やせばザラザラ感もかなり無くなっていたと思います。
裏面は少し変色していますが、スティックのりの変色だと思います。
ABSは出力したあとの収縮が一番問題視されますが、
近日部品を印刷するので、それでチェックしてみたいと思います。
いよいよ熱による強度変化に問題がでてくることが多くなり、
ABSに乗り出すしかない状況になってきました。
ヒートベッドは85度くらいまでしか上がらないので、
自信がなかったのですが、問題という問題はまったく起きず
キレイに印刷されちゃいましたよ。
1層目が240度、2層目以降は225度に温度を設定しています。
0.05mm積層ですが、1層目は130%にしてますので少し厚みがあります。
1回目のテスト印刷では逆にガラス面に強固にくっつきすぎて、
無理にはがそうとしたらレイヤー1層目が本体から剥離してしまい
壊れてしまいました。PLAではこんなことなかったんですがねぇ・・・
下の写真は2回目に印刷したものです。


左が表、右が裏。
文字もはっきり印刷されていて、PLAのときより鮮明です。
上面の層をもう一層増やせばザラザラ感もかなり無くなっていたと思います。
裏面は少し変色していますが、スティックのりの変色だと思います。
ABSは出力したあとの収縮が一番問題視されますが、
近日部品を印刷するので、それでチェックしてみたいと思います。