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レジスタの特徴に大きく左右されるので、
一度実験しておくと今後悩まずにコードが書けるはず。
忘れっぽい私にはとても重要なことなのです。
3D-PRT30)ABSのフィラメントにチャレンジしてみた
2016.11.16
いままで必要な部品をPLAで印刷してきたのですが
いよいよ熱による強度変化に問題がでてくることが多くなり、
ABSに乗り出すしかない状況になってきました。
ヒートベッドは85度くらいまでしか上がらないので、
自信がなかったのですが、問題という問題はまったく起きず
キレイに印刷されちゃいましたよ。

1層目が240度、2層目以降は225度に温度を設定しています。

0.05mm積層ですが、1層目は130%にしてますので少し厚みがあります。
1回目のテスト印刷では逆にガラス面に強固にくっつきすぎて、
無理にはがそうとしたらレイヤー1層目が本体から剥離してしまい
壊れてしまいました。PLAではこんなことなかったんですがねぇ・・・
下の写真は2回目に印刷したものです。
 




左が表、右が裏。
文字もはっきり印刷されていて、PLAのときより鮮明です。
上面の層をもう一層増やせばザラザラ感もかなり無くなっていたと思います。
裏面は少し変色していますが、スティックのりの変色だと思います。

ABSは出力したあとの収縮が一番問題視されますが、
近日部品を印刷するので、それでチェックしてみたいと思います。
3D-PRT29)レイヤー1層目の印刷の粗さを解決する
2016.11.15
モアイの印刷でもそうでしたが、1層目の印刷が上手にいきません。
定着が甘いだけでなく、線が細い気がするのです。
印刷されたものはザルのように網目状の物になります。

思い起こせば、この症状はDRV8825に交換したあたりから出てるような気がするなぁ・・・
なんてことが頭に過り、
もしかしてConfiguration.hのDEFAULT_AXIS_STEPS_PER_UNITの
値を300にしていましたがここが間違っているのでは??
なんてことも考えたりしちゃうわけです。
ここを試しに600にして印刷してみると、1層目はかなりきれいに印刷されるのですが、
上に積み上げられていく部分はフィラメント過多でぐちゃぐちゃになります。
そもそも300の時で、エクストルーダーから吐き出されるフィラメントの長さが
指定通り正確に刻まれています。
ということは設定ミスでも無いわけで、しばらく途方に暮れていたのですが、
運よくこの↓ページを見つけまして、
http://forum.genkei.jp/forums/view/4
オフセットをベッドの高さから0.1mmにしますと、
今までのことがウソのように治りました。
定着も綺麗で、艶も出て、網目にならず全面が塗られている。
まさかこんな単純なことだったとは・・
「ノズルでフィラメントを押し広げながら移動している」
このイメージが重要なんですね。
参考したホームページではタイトルに
「1層目を制したものが3Dプリンターを制する。」
と書かれていますが、まさにその通りだなと実感しましたね。

1層目をきれいに塗れたことで水平の微調整も印刷物の艶を見ながらかなり追及できました。
Arduino 1) Arduino UNO+LCD2004+I2C
2016.11.15
Arduinoを使いこなしたいという願望がありながら、
全く手つかずまま5年以上が過ぎた今日この頃。
小学生ですらArduinoを理解して使いこなしているというニュースが
先日TVで流れていました。軽くショックです。
昔に比べ導入費用も極端に下がったことから
そろそろ私も勉強を始めようかと・・・

本家のArduino UNO R3で800円、
中国の互換機であれば送料込みで350円で買えてしまいます。
吉野家の牛丼並盛(380円)より安いです。
(透明なケースは150円未満)

勉強なので、互換機に手を出すのは成長してからということで、
今は正規品で行きます。
そしてLCD表示にいきなり突撃します(笑)
なぜなら、動作チェックのために、いちいちLチカさせたり、
シリアルモニタで監視するというのも面倒くさいので
内部の詳細情報を液晶に出せたら楽だなと思ったからです。

まずは定番らしい↓のLCDモニタを使います。

スマートエレクトロニクスlcdモジュールディスプレイモニターlcd2004
20*4キャラクタ 5ボルト ブルーバックライト


とにかく安い。送料無料でほぼ400円。
しかもシリアル通信するためのI2Cが付属(ハンダ付け済)。
これがあれば、電源5V、GND含めて計4本の接続で済んでしまいます。
ピン数が限られるArduino UNOには大助かりです。

お急ぎの方はちょっと高めだけどアマゾンでも売ってます。

(アマゾンのはI2Cの種類が違うので若干違うかもしれません。)




液晶側のGNDをArduinoのGNDへ
液晶側のVCCをArduinoの5Vへ
液晶側のSDAをArduinoのAREFの右隣
液晶側のSCLをArduinoのAREFの2つ右

これだけ。ド素人の私にもなんとかついていける!

プログラム側を考えてみる。
どうやら一からコードを書く必要はないらしい。
すでにライブラリが用意されていて、ダウンロードすることで簡単に使えるようだ。
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
ここから最新ライブラリ(現在はNewliquidCrystal_1.3.4.zipが最新の様子)
ArduinoIDEを立ち上げて、これを登録する。
方法は
スケッチ>ライブラリをインクルード>.ZIP形式のライブラリをインストール
と辿って、ZIPファイルを指定するだけでいい。
すると勝手に展開されて、

C:\Users\*******\Documents\Arduino\libraries\NewliquidCrystal

ここに格納される。ふむふむ。なかなかに親切だ。
ではこのライブラリをどのように使うかというと、ちょっとネット検索して悩んだ。
とりあえず、ライブラリをIncludeするのは、ArduinoIDEの機能で一発ポンでできるようだ。

スケッチ>ライブラリをインクルード>NewliquidCrystal


ソースコードの最上部に必要なヘッダコードが追加されましたよ。


これで全ての情報が整ったと思ったらどうやらそうでは無いようだ。
シリアル通信をするためにはチップのアドレスを把握しないといけないらしい。
I2Cのチップをルーペで見てみるとPCF8574ATを使っているようだ。

どうやらチップごとにデバイスアドレスが違うようで、
(上写真は説明用PDFから抜粋です。)
A0,A1,A2ジャンパー部分がすべてオープンになっていることから
ウチのは0x3Fのようだ。

ではコードを書き書き(`・ω・´)
いろんなサイトをめぐり記述方法を調べ、
試行錯誤で以下のコードを作成してみる。



さてコンパイル・・

ボードArduino/Genuino Unoに対応するコンパイル時にエラーが発生しました。
exit status 1
ボードArduino/Genuino Unoに対するコンパイル時にエラーが発生しました。


まじすか・・・
ユーザーコードを書かないで、includeだけでコンパイルしてもエラーがでる。
どうやら自動的に追加された「# include SoftI2CMaster.h 」が悪さしているようだ。
これを外したらうまくいきましたよ。
実際は

#include LiquidCrystal_I2C.h

この1つがあれば、文字を表示するだけなら十分なようだ。
そしてLCD2004の画面は・・・



キター!( *´艸`)
カーソルの動きも、バックライトの点滅、スクロール等、すべて動いてます。
スクロールは、2行単位で上下入れ替わる謎の現象が起きてますが、
使うことはないので、良しとします。

これでやっと次のステップへ進めそうだ
最近流行りのUEFI/GPTパーティションを消す
2016.11.09
3TB以上のHDDや、タブレットっぽい使用が多くなってきた昨今は
高速起動を求める為にUEFI環境が多くなってきたように思えます。
1台しかPCを持ってなくて、それだけで全ての用が足りる人は
とても重宝しているとは思うのですが、
HDDを頻繁に接続やらバックアップやらをしている人、
ウチのように他人のPCをバラす機会が多い人にとっては
結構メンドクサイものだったりします。
そもそもSSDがこれだけ安価になってくると、
起動速度面ではさほど優位ではないですし、
MBRを乗っ取られる心配がなくなるよ?っていう話もありますが
(玄人にはこれが一番必要なことかな?)
使っていて便利という実感はわかないですよね。
まぁ、グチはここまでにして、

さて、GPT形式になっているHDDを昔の方式で扱いたい場合、
すんなりとはいきません。フォーマットすら簡単にできませんよ。
自由にパーティションを切ったりフォーマットしたりするには
コマンドプロンプトから専用のコマンド(diskpart)を用いて行う必要があります。

以下にウチで行った一例を書いておきます。
1TBのHDDをUSB接続しています。
ディスク4として認識してますが、これをスッキリさせてしまいましょう。

===========================================
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.


C:\>diskpart

Microsoft DiskPart バージョン 10.0.14393.0

Copyright (C) 1999-2013 Microsoft Corporation.
コンピューター: *******


DISKPART> list disk

 ディスク      状態         サイズ   空き   ダイナ GPT
 ###                               ミック
 ------------ ------------- ------- ------- --- ---
 ディスク 0    オンライン      119 GB   0 B
 ディスク 1    オンライン      111 GB   0 B
 ディスク 2    オンライン
      1863 GB 0 B
 ディスク 3    メディアなし    
0 B     0 B
 ディスク 4    オンライン
      931 GB  0 B

DISKPART> select disk 4

ディスク 4 が選択されました。

DISKPART> list partition

Partition ### Type Size Offset
------------- ------------------ ------- -------
Partition 1 プライマリ 15 TB 4096 B


DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました。

DISKPART> list disk

 ディスク      状態         サイズ   空き   ダイナ GPT
 ###                               ミック
 ------------ ------------- ------- ------- --- ---
 ディスク 0    オンライン      119 GB   0 B
 ディスク 1    オンライン      111 GB   0 B
 ディスク 2    オンライン
      1863 GB 0 B
 ディスク 3    メディアなし    
0 B     0 B
*ディスク 4    オンライン
      931 GB  931 GB

DISKPART> exit

DiskPart を終了しています...

============================================

これで空きが931GB(1TB)になりました。
そしてパーティションを作成してフォーマット。
これで完了。

GPTパーティションでないと動かない時代がくるんだろうか・・
SSDがもっと安価になって、3TBを超えるようになったら考えよう( *´艸`)

- CafeNote -