DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

RaspbianにSSH接続する

古いRaspbian(Wheezy)のシステムを最新のイメージ(Jessy)で再構築しようとしたらSSH接続が出来なかった。

ダウンロードしたのは

RASPBIAN JESSIE LITE

www.raspberrypi.org

Raspbianの最小イメージで、展開してSDカードに焼き込んで有線LANに繫ぎ、リモートでSSH接続しようとしたら弾かれた。

pingは通るので「?」となりssh繋がらないで検索かけたらこちらのページがヒットした。

raspberry pi 3でSSH接続できない? - Qiita

ふんふん、なるほど。2016/11以降のイメージではSSHがデフォルトで無効になっているらしい。

pi:raspberryでログイン出来てしまうので安全面を考えると納得の処置だけど面倒くさいなあ。と思いながらキーボードやディスプレイを繋いでブログの通りにコマンド打ってみたが

ラズパイ

訳(感情移入あり)

「そんなマウントポジションありましぇーんw touchってなんですの?」

 

 

って弾かれた^^;くそー。

てことで、とりあえず

sudo systemctl start ssh

と打ってみたら

ssh接続出来た。

なーんだ、デーモンが動いてなかっただけじゃん。

で、デフォルトでssh動くように

sudo systemctl enable ssh

 

これでデフォルト起動するようになった。

 

今までイメージ焼いて電源とLAN刺して後はSSHで設定していたのに、若干面倒くさい仕様になった。いや、LITEイメージだからかもしれないけど、とりあえず覚え書きとして纏めておいた。

 

ついでに、rpi-updateコマンドも通らなくなっていた。

これは、通常パッケージアップグレードで安定板にアップされているので必ずしも最新にアップデートする必要無いということで非推奨だそうな。

どうしても最新版が使いたければ

sudo apt-get install rpi-update

とすればrpi-updateコマンドが通り、ファームの最新版が入手出来る。

いろいろ変わるもんだなー。

オートキャリブレーション機能とは何か

3Dプリンターについているオートキャリブレーションという機能が便利だと以前のブログで紹介した。 

dreamerdream.hateblo.jp

 

キャリブレーションとは「調整」であるが、3Dプリンターでは一般的に水平レベル調整のことを指す。

3Dプリンターは3軸で動いて物体を構成するので、作成された物体が乗るベッドとホットエンドよ呼ばれる出力ノズルの動きが水平でないとちゃんとした物体が構成できない。

 

3Dではややこしいので真横から見た2Dの図として説明すると

これが完ぺきに水平が取れている理想の型

f:id:DreamerDream:20170210111558p:plain

 

白がノズル用のレール

赤がノズルが移動する位置、当然レールと平行

緑が作成された物体

青がベッド

 

で、レールの高さが狂うと

極端にいうとこういう状態になる

f:id:DreamerDream:20170210085809p:plain

 

実際にここまで傾くと販売出来るレベルでは無いがわかりやすく傾けてある。

製品として完成した状態ではキチンと調整してあるが、出力用ベッドにシートをつけたりヒーターを付けたりすることで傾きが出るの。また長期間使用によるレールの摩耗等によって傾きが出ることもある。

 

そこで手動のキャリブレーションの場合、レールの位置やベッドの位置をネジ等で調整して真っ直ぐにする訳だが

オートキャリブレーションの場合はネジを回す必要がない

もちろんキャリブレーション専用のモーターなんぞ搭載していない(高級機にはついているかもしれないが知らない)。

 

じゃあどうやって高さ調整しているの?

ってことで、オートキャリブレーションの仕組み

基準になる点までノズルを移動させて

f:id:DreamerDream:20170210090401p:plain

ノズルがベッドに当たるまでレールを下げる

f:id:DreamerDream:20170210090453p:plain

次に、調整したい点にノズルを移動させて

f:id:DreamerDream:20170210090652p:plain

またノズルがベッドに当たるまでレールを下げる

f:id:DreamerDream:20170210090738p:plain

 

すると、最初の基準点とどのぐらいズレているかレールを昇降した量でわかる

f:id:DreamerDream:20170210091100p:plain

この差とヘッドの移動量を計算してヘッド左右に動く度にレールやベッドを上げ下げするのだ

f:id:DreamerDream:20170210091405p:plain

こうして綺麗な物体を形成できる。という仕組み。

もちろんベッド側が傾いている場合でも要領は同じ

f:id:DreamerDream:20170210091723p:plain

 

実にうまく出来ているが、実際にはノズルとベッドには多少の傾き発生している状態で上下調整しながらの不安定な出力になるので本当は手動でクリアランスがちゃんと取れているか確認して調整した方が綺麗な物が出来るのは間違い無い。

ただ調整の手間や機械慣れしていない場合だと便利な機能なのでプリンター購入の際の基準に入れて良いと思う。

 

但し、組み立て式のプリンターの場合はまず初回時には手動キャリブレーション必用なので手動キャリブレーションも知っておく必用がある。

手動のキャリブレーションの方法はこちら↓

dreamerdream.hateblo.jp

 

3DプリンターをOctoPiで制御し、Webブラウザで設定や監視が出来るようにする

3Dプリンターは通常のインクジェットプリンタと違いプリントスピードが遅い

数時間〜時には数十時間かかるものもある。

なので直接パソコンと繋いで動作させているとその間パソコンの電源を落とす事は出来ない

SDカードにG-codeデータを保存しておき、後は3Dプリンターにおまかせという機能の付いたプリンターも存在するしPepRapの自作機でもArduino制御でそのような機能を持たせることも出来る。プリンターの機能としては十分でプリント中にパソコンを付けておく必要が無いので省エネである。

しかしプリントデータの移動や監視は実際のプリンターでダイレクトに行う必要があり、遠隔監視ということは出来ない。

 

ということで、遠隔制御が出来るのか?を調べると

 

・OctoPrintのOctoPiプロジェクト

octoprint.org

 

AstroPrint

www.astroprint.com

 

というものがあるということがわかった。

どちらもオープンソース無料。RaspberryPiをプリンタ制御マシンとして、制御インターフェースをブラウザで提供出来る仕組みだ。

しかもカメラで現在どのような行程なのか見えるのでその場に居なくても良い。

「ブラウザ」から操作出来るということはパソコンが手元に無くてもスマホでもタブレットでも制御可能ということだ。

(僕はお値段の手頃さもありAmazonのFireタブレットを3Dプリンター制御専用機として愛用している。)

 

どちらもRaspberryPi用に予めSDカードにシステムがインストールしているものをキットとして購入出来るという超お手軽仕様の本体自体も提供しているので初心者でも安心だ。

 

僕の所持した3Dプリンターを調べるとOctoPiの実働実績情報が得られたのでOctoPiを使うことにした。

OctoPiはOctoPrintというどんなマシンからでもWeb制御を提供するというプロジェクトのラスパイバージョンのようだ。

 

まずはダウンロードページに行き、OctoPrintのイメージをダウンロードしてくる。

octoprint.org

既存のラズパイがあればそれに機能追加としてOctoPrintをインストールする方法もあるが、プリント中にバックでイロイロ動くより3Dプリントに専念してほしいから専用マシンとして動かすことにした。

RaspberryPiはバージョン1、2、3全て対応しているので1つ余っていた1を使う事にした。

スライスには時間がかかるがプリント中はG-codeを走らせるだけなので1でも充分だ。

インストール方法はこちらのブログを参照させていただいた。

Octoprintのインストール方法

 

ラズパイのシステムインストールに関しては以前に書いた記事の通りなので、コレと同じ。 

dreamerdream.hateblo.jp

 

ーーザッックリおさらいーー

piユーザーでログイン

パスワードは初期"raspberry"

rootとpiユーザーのパスワードの変更(OctoPiのデフォルトユーザーなので消さない)

sudo passwd root

sudo passwd pi

一般ユーザーの追加

sudo adduser [username]

ユーザー権限の追加

visudo

[username] ALL=(ALL) NOPASSWD: ALL

初期sshポート変更
sudo nano /etc/ssh/sshd_config
の22ポートを任意に設定
sudoログイン禁止
PermitRootLogin yes を PermitRootLogin noへ変更

ストレージ容量拡張

sudo raspi-config

アップデート

sudo apt-get update

アップグレード

sudo apt-get upgrade

再起動

sudo reboot

と、ここまでが初期設定

ーーーーーーーーーーー

 

有線LAN接続しておく。

次に、OctoPiの接続設定

sudo nano /boot/octopi-network.txt

の最終行を編集(#を削除)

auto eth0:1
iface eth0:1 inet static
#address ***.***.***.***
netmask 255.255.255.0
#broadcast ***.***.***.255

これでブラウザからラズパイのあるアドレスを入力

http://192.168.0.13

するとラズパイで動いているOctoPiのページが表示されるようになる。

f:id:DreamerDream:20170207130903p:plain

で、このままだと英語。そのままでも使えるけど不安な場合は

GoogleChromeブラウザで開くと自動翻訳が選択出来るので翻訳させる。

f:id:DreamerDream:20170207131225p:plain

直訳だけど日本語化成功!

ログインしてユーザーとパスワードを入力して準備完了。

 

ここまで出来たらプリンタにブラウザから接続出来るんだけど、その前にもう一手間。

 

Raspberry Pi Model B+の場合USBポートの電力量が少ないので安定させるために1.2Aの電力供給を許可する。

sudo nano /boot/config.txt

に次の3行を追加

#USB Port 1.2V Up
safe_mode_gpio=4
max_usb_current=1

 

無線LANのパワーセーブモードを解除

(ここで無線接続の設定は面倒なので割愛)

sudo nano /etc/modprobe.d/8192cu.conf


# Disable power saving
options 8192cu rtw_power_mgnt=0 rtw_enusbss=1 rtw_ips_mode=1
を追記。

再起動させる。

sudo reboot

 

で、もう一度OctoPiに繋いでログイン

 

参考にさせて貰ったページには

STL形式ファイルやOBJ形式ファイルをインポートすればスライスまで完了してくれる便利機能があるんだけど、CuraEngine というプラグインを入れて STL をスライスできるようにする必要があり、

https://ultimaker.com/en/products/cura-software/list

からver 15.04.x をダウンロードしてARMようにビルドして〜云々〜と書いてあった。

面倒くさいなーと思っていたが今はブラウザ上でプラグインをインストール出来るっぽい。

以下google翻訳を使っての説明です。

右上の「設定」を開いて

f:id:DreamerDream:20170207132555p:plain

インストールされたブラグインを下にスクロールすると

「もっと見る」ボタンがあるので押すと

f:id:DreamerDream:20170207132726p:plain

必要なプラグインを簡単にインストール出来るようになっている。

RepRapで使われるMarlineのEEPROMの値の取得から変更まで可能になる。

試しに作って放置していたMarine基盤に繋いでみた

f:id:DreamerDream:20170207133027p:plain

おおっ!初期値がちゃんと読み出せてる。

かなり高機能だ。

 

これでプリント中もスマホから作業状態をチェック出来るようになる。便利〜♫

 

遠隔監視操作が出来るというメリットは他にもある。

3Dプリンターでプリント中は人体に有害な微粒子が放出される

ABSでは特に顕著で、簡単に言えばあのプラスチックの溶けた「クサイ」臭いである。

3Dプリンターからの排出物の毒性 | Gen Re

3Dプリンターの設置条件によっては気管支炎や喘息などの原因になることもあるので要注意だ。

遠隔監視してプリント中は部屋に入らない。」これだけでも微粒子を吸入するリスクは大幅に減らせるはずだ。

3Dプリンターの選び方 3Dプリンターは大は小を兼ねない!

憧れていた3Dプリンターを購入しました!

購入の際には必要な情報をいろいろ調べ回ったので皆さんにも共有できるよう、選び方を纏めることにしました。

 

3D-CADの使い方やデータは大事だけれど、最終的に満足のいくプリントが出来るか否かは3Dプリンターの基本性能に左右されるので充分吟味して購入することをオススメします。

 

考慮すべき内容一覧

結構たくさんあります。

 

[種類と価格]

一言で3Dプリンターといってもイロイロな種類があります。

熱溶解積層:一番リーズナブルな価格で一般家庭向け、amazon等で原料も手に入り易い。積層ピッチ(解像度)が細かいほど高価になる傾向があります。10万円以下とか自作3Dプリンターといえばこのタイプ。

 

光造形:日本人が発明した古くからあるタイプ。光硬化する樹脂プールの表面にレーザー光を当て、徐々に底を沈めて行く事で出力する。高価だけど10万円以内で買えるモデルも存在します。

プロジェクション形式という、レーザーに変わってプロジェクターの光で造形するモデルもある。光を一気に放てるので当然こちらのほうが高速。

 

粉末焼結:主に工業用。

プラスチック類以外にチタン、スチール等の特殊素材が扱えます。

従来の鋳造等では造形が難しかった入り組んだ部品も出来るのでジェットエンジンの部品製造など既に実用化されていることも。

高価なので一般家庭向けでは無いが特許切れにより50万以下のモデルも登場しています。

i-maker.jp

 

インクジェット:この辺りにくると調べる気にすらならない価格です。

粉末にインクを載せて1層ずつ粉末を置き、またインクを載せるという方法。

光硬化樹脂のインクを出力した直後に紫外線を当てて硬化させて積層させるという方法があります。

お値段は300万円超え。きっとインクも特殊で高価でしょう。

 

 

3Dペン

番外編として、3Dペンという選択肢があります。価格は2000円台からあるのでパソコンやソフトを使わず自らの手だけでちょっと立体造形を味わうには丁度良いし子供のオモチャとしても人気。

 

3Dプリンターと同じ材料、出力方法でありながら同じ物は2つとして作れないというオリジナル作品が作れます。

dreamerdream.hateblo.jp

 

 

様々な種類をまとめましたが、工業向けの製品である粉末焼結やインクジェット大型すぎてまだまだ一般で購入するには現実的ではないでしょう。

ということで、やはり購入するとなると熱溶解積層か光造形でしょう。

そして一般用途で材料が安く情報も豊富となると間違いなく熱溶解積層!

光造形の場合は材料のレジン自体がまだ高価なのとレジンの保存期限など管理が面倒くさい面がネックです。

 

ということで以下からは熱溶解積層タイプについて書いていきます。

 

[サイズ]

 

3Dプリンタの場合は「大は小を兼ねない」。

小さい物を最終的に大きく組み立てるように造形したり方向を工夫するほうがリスクは少ない。目的に応じたサイズを選択すべきです

造形サイズのとんでもなく大きなマシンも存在するけど、造形サイズが大きいもので一発出力しようとするとそれだけ下記のリスクが大きくなります。

 

・大物の造形時には少なからず「反り」が発生します。大物を一発で出力しようとするとまずこの反りに悩まされることになります。

・造形サイズが大きいのにプリントヘッドを支えるフレームが細い貧弱な機種は要注意です。それだけフレームがたわみ易いので必然的に精度が悪くります。

・造形サイズが大きいのにベッドが前後左右に動くような構成のものは避けるべきです。大物を造形する場合、造形物が縦に長くなると慣性でベッドから剥がれ易くなります。

・ヒートベッドのエリアが大きいとそれだけ加熱に時間がかかるし電力が無駄になります

 

 

[使える素材とランニングコスト]

熱溶解積層の場合は主にプラスチック素材、特に直径1.75mmが多くの3Dプリンタで採用されています。マイナーなフィラメントが使われているものを選ばないようにしないと材料の入手が困難になります。

3Dプリンター フィラメント」で検索すると沢山出てきます。

ABSPLAという素材が有名で基本的にその2種類の素材が扱えるプリンタも多いけれど単一素材しかサポートしていないプリンタもあるので注意です。

ABSはフィラメントとしては安く、ある程度弾力もあり、熱にも強いので素材としては良いけれど、プリント中に収縮して剥がれてしまうということが多いのでABSを使うにはベッドが加熱されるタイプのプリンタが望ましいとされます。それとプリント中の臭いがキツイのでプリントする場所を選びます。それとABSは燃えやすい素材なので火災には要注意!

PLAはプリント中の臭いがキツくなく、ABSに比べると収縮が穏やかなのでプリントしやすい素材だけど、熱に弱く60℃程度で変形するので車のダッシュボードに置くような物や食洗器で洗うような物には適さない。また弾力が少ないので割れ易い。欠点があるものの燃えにくいので万が一のトラブルでも焦げる程度で済むのが有り難いです。

ABSが使える用途が多いけれどPLAの方が3Dプリンタ出力には楽だから普段使いの用途にはPLA、熱が心配な場合はABSと使い分けられるプリンタがいいでしょう

その中でAmazonから1Kg2000円弱のPLAが使えるとランニングパフォーマンスは最高です。

フィラメントには変わり種として金属やウッドタイプのものも存在します。

 これらは樹脂素材に金属粉末等を含ませているというだけで実際に金属が出力出来るとうワケではないけど質感が金属っぽく面白い。

但し、金属粉末でフィラメントの送り機が摩耗してしまったという記事もあるので要注意!

そして最も注意が必要なのが「専用フィラメントしか使えないプリンターが存在するということです。

機械自体を安く売ってフィラメントで儲けるという販売戦略でしょう。これらの専用フィラメントは高い!機械が手頃な価格だからといって飛びつくのは危険なので要注意です。

特殊系フィラメントに関してはコチラを参考にどうぞ↓

dreamerdream.hateblo.jp

それと色々な素材をプリントするならヒートベッド」は絶対に外せない条件です。

プリンターによっては「PLAのみ」としている機種でヒートベッド非搭載モデルもあるけど、PLAでもヒートベッドを60℃程度で温めておくと剥がれなどの失敗率が減らせます。

後から付けられる機種もあるけど手間がかかるので是非とも最初からヒートベッドを搭載しているマシンを選びましょう。

 

 

[着色]

出力したものに色を付けるにはフィラメント自体が色着きの物を選ぶか着色することになります。もともと何種類かのフィラメントを色分けで出力出来るプリンタもあるのでそれでプリントするのが最も楽な方法ですがプリンタ本体は高くなります。

ABS素材の着色はプラスチック用の塗料で塗れます。

PLA素材の物は塗料が乗りにくいそうなのでパテマニキュアで表面コーティングしてから着色すると良いらしいです。

僕の場合PLAで出力したものに缶スプレーで直接ペイントしてみたらできたので、何かしら着色する手だてはあるということで用途によっては色はあまり気にしなくても良さそうです。

 

 

[設定の手間]

3Dプリンタを選ぶ時に「オートキャリブレーション」という機能を搭載したプリンタを選ぶと初期設定の手間を省く事が出来ます

3Dプリンタは幅・奥行き・高さの3方向でヘッドが動いてプリントするのでこのヘッドを固定しているレールが少しでもズレていると綺麗なプリントが出来ません。

そこで、激安のプリンタならヘッドとベッドの感覚を手動でネジで調節したりソフトウェア的に軸の移動量を設定してみたりする必要があるのです。

ここで挫折しましたとしてオークションに出品している人もいます。非常に勿体ない話だけどそれぐらい最初は手間のかかる作業なのです。自作するぐらいの意欲のある人ならそのぐらいどうっってことない作業かもしれないけど一般的なインクジェットプリンターのイメージで購入してしまうとXYZ軸方向の意味すらわからず挫折するのでしょう。

オートキャリブレーション機能はその手間を機械にさせるものです。

オートキャリブレーションについて纏めてみました↓

dreamerdream.hateblo.jp

 

 

しかし、オートキャリブレーション機能は絶対に必用な機能ではありません

最初こそ手間がかかる作業だが慣れてしまえば1〜2分もあれば完了するので気にならなければ重要視しなくても良いでしょう。

「あったら便利、けど無くても平気」な機能です。

手動のキャリブレーションの方法はこちら↓

dreamerdream.hateblo.jp

 

 


[造形の精度]

3Dプリンタの精度の1つに積層ピッチがあります。

上に何ミリ厚の素材が載せられるか?というのがこの積層ピッチ。当然細かければ細かいほど側面は綺麗になります。(側面だけ!)

ただ、細かければ細かい程プリントに時間がかかります

例えば0.1mmで出力していたものを0.05mmにすると単純計算で時間が倍になります。

作る予定のものが小さなアクセサリや細かなパーツ等であれば時間がかかっても綺麗にプリント出来るタイプを選び、事務用品のクリップ等ようなあまり細かさを気にしない物であれば積層ピッチの大きめのものを選ぶと完成が早くて良いでしょう。

また積層ピッチが大きくてもヤスリがけしたりパテ埋めしてピッチを隠すという方法もあります。

www.pp3dp.jp

精度は積層ピッチの他、モデルデザインの精度、スライサーと呼ばれるソフトウェアの精度、プリンタ筐体の剛性、モーターの種類や制御方法、ガイドレール等によって様々な要因があります。

極端に安い物にはソフトウェア的には精度の高い出力をしていてもプリンタのフレームが貧弱なものが見られます。フレームが貧弱ということはモーターまでマイクロステップで細かな制御がされていてもプリントヘッドの移動荷重に耐えられず出力先がブレるということです。

とくに重たいヘッドを備えているにも関わらずフレームが細いパイプ製ものはイマイチな性能になってしまいます。

本体剛性、形状についてのお話はコチラ↓ご参考ください。

dreamerdream.hateblo.jp

 

 

[ソフトウェア]

ソフトウェアは専用ソフトウェアから高価なもの、フリーのものまでいろいろあります。

基本的に「モデリング」→「スライス(G-code生成)」→「出力」という流れです。

専用ソフトにはスライスと出力が一体化したものやモデルツールまで含むものまで多種多様です。

 

 

モデリング

デザインするには「3Dモデリングツール」「3D-CAD」とよばれるツールが必要です。

フリーで有名なモデリングツールは無償のBlenderがあります。これは3Dアニメーション等が作れる程高機能なのですが高機能故に扱いは複雑です。他にSculptrisなど有料を含めると沢山のモデリングツールがあります。

3DCADソフトとしては無償のFreeCAD123Dシリーズ(現在サービス終了)、学生・教員無料のFusion360SketchUPなどが有名です。

どのようなツールを使うにしろ、3Dデータ形式の有名所.obj.stlファイル出力に対応していれば次のステップ、スライサーへデータをもっていけます。

ちなみに、CADならJw-cadのように2.5次元表示できるものもあるので2DCADでもいいんじゃないの?と思われるかもしれないけどデータの生成方法がぜんぜん違うのでやはり3D用のツールが必用です。

dreamerdream.hateblo.jp

3Dモデリングツール「Blender」の初歩的な使い方を纏めてみた。

dreamerdream.hateblo.jp

 

 

スライサー

これが3Dモデルをいかに効率良くプリントするか?が決まる肝心なツール。

スライサーでは、3Dモデルを何層にもスライスしていき、3Dモデルの中なのか外なのか?を判断して素材をどのぐらいの量どの位置へ出力するか、また場合によってはサポート材やラフトを含めたデータをG-codeという実際にプリンタのヘッドを動かす情報としてコードを生成します。

Slic3rが簡単で有名。他にCuraやKisslicerなど無償のものも多くあり、格安3Dプリンターはそれらを利用することを推奨しているものが多いようです。

dreamerdream.hateblo.jp

 

 

 

プリンタ制御

 スライサーから出力されたG-codeデータをプリンタへ適切なタイミングで出力するための「ファームウェア」と呼ばれるソフトウェア。

メーカー品として販売されているプリンターではあまり意識しなくても使えるようになっています。

有名なものでは自作プリンタのRepRapプロジェクトでよく使われるArduino用のMarline。

要はこの基盤上に使われているソフトなので自作派の人だけは要チェックです。

 

 

 

 

 

[スタンドアローン駆動や遠隔制御] 

スタンドアローン駆動とはパソコン無しでも3Dプリンター本体にデータを送ると本体だけでプリントをしてくれる機能のことです。

その機能の延長で遠隔操作やプリントの様子をカメラでモニター可能にしたモデルが存在します。

非常に便利な機能なのであると重宝します。「あったら便利、無くても平気」な遠隔制御や監視カメラ搭載モデルはやはり高価な上位機種だけど、実は安い機種でもマイコンボードを制御マシンとすることで後から安価に追加することも可能な機能なのです。

dreamerdream.hateblo.jp

特にABSの出力時には有害な微粒子が放出されるので遠隔制御が望ましいとされます。

 

 

[その他、必要な工具]

スクレーパーペンチ等はバリ取りやサポート材の除去に必要です。

印刷領域の清掃には工業用アルコール。

プラットフォームシートは素材の食いつきが良くラフト不要になるのでフィラメントの節約にうってつけです。

<実際に使ってみた記事> 

dreamerdream.hateblo.jp

 

その他、3Dプリンターと一緒に購入しておくと良いもの↓

dreamerdream.hateblo.jp

 

 

 

現在進行形でイロイロなプリンターがどんどん出ているし、便利な機能も多くなっているので。「コレが一番良い!」と言及することは出来ないけど、1つでも選ぶ際の指標の参考になれば幸いです。

Amazonでも「3Dプリンター」と検索すれば多数出て来ます。

くれぐれも買って後悔することのないよう慎重にお選びください。 

dreamerdream.hateblo.jp

 

3Dプリンターのデータ作成から出力までの大まかな流れも載せています。

dreamerdream.hateblo.jp

 

 

dreamerdream.hateblo.jp

 

dreamerdream.hateblo.jp 

dreamerdream.hateblo.jp

  

 

dreamerdream.hateblo.jp

 

 

 

コンピュータと人の感覚の違い

初めてコンピュータでプログラムを組んで何かを実行させようとするとコンピュータの速度に驚くと思う。

 

f:id:DreamerDream:20191230144318p:plain

例えば、下のpythonプログラムをRaspberryPiで実行すると、1から順番に1足した値が画面出力される。

c = 0
while True:
 c += 1
 print str(c)

実行結果

1
2

(略)

1396

1397
1398
1399

 

RaspberryPiのような非力なコンピュータで速度の遅いスクリプト言語を実行させても一瞬(1秒ぐらい?)で1000回ぐらいループしているのが解る。

 このようにコンピュータの「一瞬」という表現は人の感覚では測れないほど高速なのだ。

これを覚えておかないと電子工作の回路の設計ではまず

チャタリング

というものに悩まされることになる。

チャタリングの概要 | マルツオンライン

 

機械式スイッチ(トグルスイッチ・プッシュスイッチ・スライドスイッチ・機械式リレー)をコンピュータに接続して信号として入力する場合、スイッチのON-OFFの際にほぼ必ず接点がバウンドする状態が作り出されてしまう。

人が「えいっ!」と”一瞬”にしてスイッチを押した瞬間、コンピュータにはON-OFF接点バウンド信号が”しばらくの間”入力されてしまう。

例えば、RaspberryPiのGPIOでスイッチ入力させるプログラムをPythonで書いて実行させ、スイッチを押すと

 

「スイッチ入力回数表示プログラム」

#!/usr/bin/python
#coding:utf-8

import RPi.GPIO as GPIO
import time

Switch = 22
count = 0

def switch_callback(gpio_pin):
  global count
  count += 1
  print "count=" + str(count)

def standby():
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(Switch, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  GPIO.add_event_detect(Switch, GPIO.BOTH)
  GPIO.add_event_callback(Switch, switch_callback)

  while True:
    time.sleep(1)
  GPIO.cleanup()

 

if __name__=='__main__':
  standby()

 

 

結果

count=1
count=2
(略)
count=10
count=11
count=12 

 

1度だけスイッチを押したハズなのに何度もカウントされてしまうのだ。

これを予防する処置としてスイッチ回路の設計やプログラムで暫く待つ(20ms程度)という処理を入れなければ思ったような処理をさせることが難しくなる。

 

このように人にとっての「一瞬」は機械にとっては「しばらくの間」だという感覚でプログラムもしないと予期せぬエラーに見舞われることがあるので要注意だ。

 

 

次に「通信速度」の問題

 

さて「光の早さ」は30万キロメートル/秒。電気信号も光の早さで伝達される。

同軸ケーブルで伝達される高周波信号は若干遅くなるらしいが、ここでは電気信号=光速としておく。

1秒間に300,000kメートルというと地球7週半(一周40,000km)/秒とされ、途方も無く早いイメージだけど。

 

ここで問題

「地球の裏側と通信するのにどのぐらい時間がかかるのでしょうか?」

 

つまり、「地球半周はどのぐらい?」ということ。

※実際には海底ケーブルや衛星通信等でもっと長距離になるのだけど、ここでは単純に直線で結んだ場合を想定するものとする。

地球の円周は40,000kmなので20,000kmは

半周にかかる秒数 = 20,000km / 300,000km = 0.0666....秒

大雑把に計算しても最速で最低66ミリ秒はかかる。ということですね。

受け取った信号に対して返信するとさらに66ミリ秒。

処理速度を入れず、単純に信号の往復で最速132ミリ秒です。

 

この「ミリ秒」というのは機械にとっては「かなりの時間」なのだ。

以前、コンピュータの通信エラーによりロケットの打ち上げ延期になったことがあった。

イプシロンロケット、打ち上げ中止より重要な「失敗」 | 宇宙開発にひとこと

この0.07秒(70ミリ秒)の信号の遅れでコンピュータはエラーを発生させ、国家事業が延期になってしまったのだ。

 

今の時代、小さなマイコンでも10MHzや8MHzという周波数で動いている。

1MHzとは1秒間に1,000,000回命令処理する能力だ。

1MHzで1クロックの間に信号を伝達出来る距離 = 300,000,000m / 1,000,000 = 300m

なんと光の速度でも1クロックの間には300mしか進まない。

10MHzだと30m

1GHzだと0.3mだ。

つまりケーブルが30cm以上あると1GHzのCPUの1クロックの間では通信出来ないということなのだ。

まあ、一般的なPC間の通信なら「通信プロトコル」というものに合わせて組むのでこのレベルの心配は不要だが、マイコンを用いたローレベルでの通信プロトコルを自分で組むには通信ラインの長さも意識しないといけない。

 

ものすごく高速に遠くにデータを伝達しなければいけないようなプログラムを組んだ場合、いかに必用データ量を少なくするか?がキモになってくる。

動画配信サービス等はこの辺りがよく考えられていて動画の形式と視聴する端末によってデータを最小限に抑え、できるだけ近くのサーバーからデータを送れるよう工夫されている。

 

PythonでTwitterAPIを使って投稿する

まず、TwitterAPIを使って投稿するのに参考にさせていただいた記事内に「OAuth認証はややこしいので凡人はライブラリを使う」と書いてあるので僕もpipを利用してインストールしたのが前回の記事

dreamerdream.hateblo.jp

 

 「基本はHTTP Requestを送ってJSONを得るだけなので、わざわざTwitter専用のライブラリを使うことも無いと思って自分で書いてみた。

とあるので自分も練習がてら参考にさせてもらいながらTwitterの投稿、タイムライン取得、検索等のクラスを自分で書いて備忘録として残すことにした。

 importしているfile_mngは以前書いたヤツを利用

dreamerdream.hateblo.jp

 

 

/usr/local/lib/twitter.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

from requests_oauthlib import OAuth1Session
import json
import file_mng


etcDir = "/usr/local/etc/"

#twitter main URL
url_twitter = "https://api.twitter.com/1.1/"
#tweet URL
url_tweet = url_twitter + "statuses/update.json"
#timeline URL
url_time = url_twitter + "statuses/home_timeline.json"
#search URL
url_search = url_twitter + "search/tweets.json"


class Twitter:

    CK = '***' # Consumer Key
    CS = '***' # Consumer Secret
    AT = '***' # Access Token
    AS = '***' # Accesss Token Secert

    def setKeys(self,etcFilename):
        self.keys = file_mng.load(etcDir + etcFilename)
        for s in self.keys:
            sp = s.split(":")
            if sp[0] == "CK":
                Twitter.CK = sp[1]
            if sp[0] == "CS":
    Twitter.CS = sp[1]
            if sp[0] == "AT":
    Twitter.AT = sp[1]
            if sp[0] == "AS":
    Twitter.AS = sp[1]

    def search(self,params = 'test',url = url_search):
        self.spara = {"q":params}
    # OAuth で GET
    self.twitterKey = OAuth1Session(Twitter.CK, Twitter.CS, Twitter.AT, Twitter.AS)
    self.req = self.twitterKey.get(url, params = self.spara)
        self.list =
    if self.req.status_code == 200:
    # レスポンスはJSON形式なので parse する
    self.res = json.loads(self.req.text)
    self.dic = self.res["statuses"]
            for rs in self.dic:
                self.list.append(rs["text"])
    else:
    # エラーの場合
            self.list.append("Error: %d" % self.req.status_code)
        return self.list

    def timeline(self,params = {},url = url_time):
        # OAuth で GET
        self.twitterKey = OAuth1Session(Twitter.CK, Twitter.CS, Twitter.AT, Twitter.AS)
        self.req = self.twitterKey.get(url, params = params)
        self.list =
        if self.req.status_code == 200:
            # レスポンスはJSON形式なので parse する
            self.timeline = json.loads(self.req.text)
            # 各ツイートの本文を表示
            for twt in self.timeline:
                self.list.append(twt["text"])
        else:
            # エラーの場合
            self.list.append("Error: %d" % self.req.status_code)
        return self.list

    def tweet(self,params = "test", url = url_tweet):
        self.tpara = {"status":params}
        # OAuth認証で POST method で投稿
        self.twitterKey = OAuth1Session(Twitter.CK, Twitter.CS, Twitter.AT, Twitter.AS)
        self.req = self.twitterKey.post(url, params = self.tpara) #tweet

        # レスポンスを確認
        if self.req.status_code == 200:
            return ("OK")
        else:
            return ("Error: %d" % self.req.status_code) 

 

CK = '***' # Consumer Key
CS = '***' # Consumer Secret
AT = '***' # Access Token
AS = '***' # Accesss Token Secert

の***部分を取得したキーに置き換えるとそのまま使える。 

/usr/local/etc/(任意のファイル)

CK:***********

CS:***********

AT:************

AS:***********

に認証キーファイルを置き、クラスのインスタンスにsetKeys(任意のファイル名)で認証キーのファイル名を渡し、簡単に置き換えられる仕様にした。

また、タイムラインや検索結果の複雑な辞書形式のものを簡単なリスト形式に変換して取得するようにした。

使い方。

test.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

from twitter import Twitter #インポート

tw = Twitter() #インスタンス生成

#tw.setKeys("(任意のキーファイル名)")#キーファイルを設定

print tw.tweet("テスト投稿")#投稿、成功したら「OK」が返る

timeline = tw.timeline()#タイムラインをリスト形式で取得
for s in timeline:
  print s

search = tw.search("検索")#検索をリスト形式で取得

for s in search:
  print s

 

※  python2.7なので環境によって文字列の変換エラーが出るかもしれない。

 

 

 関連記事

dreamerdream.hateblo.jp

 

 

RaspberryPiからTwitterへ投稿する

以前、RaspberryPiもPythonも弄ってない状態のときに興味でJavaから「Twitter4J」というライブラリを利用してTweetすることに成功したものの、「あ、出来るんだー」という感想だけで終っていた。

 

twitterを少し活用しようかと思い、今回はRaspberryPiからPythonを用いてtweetしてみようと思ったので備忘録。今回は完全に個人の備忘録なので割愛している部分があります。

 

参考にさせていただいたサイトはコチラ

qiita.com

 

このページで説明されている「OAuthのライブラリ」というものが必用なのでGGるとGitHubにあがっていた。

GitHub - requests/requests-oauthlib: OAuthlib support for Python-Requests!

へー、知らなかった。ということでこれまたよく解っていないpipを用いてインストール出来るの?と試してみたら。

sudo pip install requests-oauthlib

 

あら、アッサリインストールされた^^

ということで、以前に取得していた

  • Consumer Key
  • Consumer Secret
  • Access Token
  • Accesss Token Secert

を上記サイトのxxx部を書き換えて書き込みテストしたら、あっさり成功。

 

スクリプト言語なので楽よねー^^ラズパイなので24時間稼働OKだし何かを検索するにはうってつけの環境!

kampa.me