FreeNASをプロキシサーバーに(したかった編)
フィルタリングってうざいですよね
ガラケーなら黙ってすっこんでる他ないけどアドエスと最近また新しいβ版が出たOperaMobileならプロキシ通せば最強じゃね?というよくある発想。
OperaTurboって手もあったけれど最近はOperaTurbo経由の制限サイトへのアクセスも目ざとく見つけて引っ掛けてくれるようになったのでちょっと本気出してみた。
うちには常時稼働のQuadサーバーとかがあるからそれで仮想化サーバーでも走らせられればいいけど親父のマシンなので却下。
で、最近電源投入すらしないFreeNAS化したLet’s note L1があるけどこいつプロキシ化できないの?とおもってググってみたらそれっぽいのがあった
FreeNAS forum ? View topic – Turning Freenas into a proxy server with Glype
http://sourceforge.net/apps/phpbb/freenas/viewtopic.php?f=15&t=2085
上の方で散々php5がどうのcompileがどうの書いてあるけど、最後の最後にあるどんでん返し
ってのが今回やって成功した方法。
要するに「そんな事しなくてもこれ1行で出来るよ」だそうな。
手順:
- TeraTermとかSSHが使える環境を作る
- SSHを有効にする
- TeraTermで接続
- さっきの「pkg_add -r 3proxy」を実行
- 結構すぐ終わるのでファイルエディタで「/usr/local/etc/3proxy.cfg」(多分)を以下のように(多分)編集する
log /var/log/3proxy.log D rotate 30 users admin:CL:password internal 127.0.0.1 external 192.168.1.1 auth strong proxy ?p8080 system “echo start 3proxy”
- 「3proxy /usr/local/etc/3proxy.cfg」を実行
- そのまんまプロキシの設定を
IP:FreeNASのIP
Port:8080
ユーザー名:admin
パスワード:password
にしてアクセスしてみる - たぶん動く(IE系だとユーザー認証ができないみたい)
- 終了するときはCtrl+C
やたら多分が付いてるのは、インストールしたのがFreeNASのembedded版で、こいつはHDDからOSイメージを持ってきてRAMディスクに展開しそこを作業領域にするLiveCDなlinuxっぽい構成なもんで、せっかく環境構築したのをリブートして全消去したせいで、記憶を頼りに書いてるから。
こんどはFull版(普通のlinuxっぽくHDDにデータを読み書きするバージョン)で試してきます
#まぁこれLinuxじゃなくてFreeBSDベースなんだけど。。
[うp]wiiハンドルもどきでロボットを動かしてみた[ソフト編]
もうすぐ1500再生・・・
たぶん動画を見てもらえると分かるんですが回路面はそんなに凝った作りじゃないです
前回に続き今回はソフト編。だらだら書いてたら1ヶ月半経ってしまった。。。
基本的な流れ
リモコン側のpicは内蔵クロック(4MHz)で動作しているうえpic自体があまり速くないので(実効1MHz)重い計算処理はすべてArduino側に投げる形で、PIC側は単にAD変換結果をRS232Cで飛ばすだけになってます。
無線部分はXBeeなので有線でシリアル通信するのとなんらプログラムに差はありません。
そしてArduinoは受信したデータからハンドルの回転角を割り出し、そこから左右のモーターをどれだけ駆動するか算出しモータードライバに出力するという流れになっています。
送信側
[ソース]
ミソ
set_adc_channel(0); //pin0にセット
delay_us(50); //AD変換待ち
value=read_adc()-X_CAL; //キャリブレート
printf("X%04lu",value); //0で埋めた4桁の数値で送信
getc(); //Arduino側が何か応答を返すまで待つ
送信側は説明のしようがないくらいに単純です
AD変換の後の待ち時間をクロックが低いのでちょっと長めに取ってみたくらい。
受信側
[ソース]
ミソ:
for(ct=0;ct<4;ct++)
{
while(!Serial.available()); //何か文字が飛んでくるまで待つ
val[ct]=Serial.read(); //配列に代入
}
/*文字列valを書式指定(%d)に従って変数prmに代入*/
sscanf(val,"%d",&prm);
受信側は説明しきれないくらい長い。。。
Arduinoはprintfとかscanfが動かない(エラーは出ないがUARTと関連づけられてない感じ)。
でもsscanfなら動くからこれでいいやって事で。
文字列->数値変換は自分で書いた方がプログラムサイズが減ったり速くなったりするだろうがこういう「動けばいい」系にそう言う凝った細工はしなくても良いと思う。プログラミングのお勉強じゃないんだし、本質的に重要なのはそこじゃない。下手に自分で書くよりかはどっかのえろい人が書いたライブラリの方がずっと速いかもしれないし。
動画でもあったように初めのうちはPC(HSP)でデバッグしていたんですがHSPのCOMポート操作命令、特に受信系が扱いづらくて、Cみたいにとりあえず何十文字かがさっと取ってきてscanfでふるいに掛けるというようなことができないので、送信後は律儀に1軸ずつ受信完了を待つような形にしています。こうすると受信側では上のように最初の1文字でswitch?caseして残りの4文字を数値として読めばいいので結構楽です。またscanfが使えなくてもこの方法ならいけるという理由もあります。
数値を出した後は後々扱いやすいようにラジアンにしておきます。
/*ハンドルの回転角(rad)を求める */ /*atan()でなくatan2()にすると0?360度の範囲で求められる */ at=atan2((1.0*int_y)-AD_NOR,(1.0*int_x)-AD_NOR); /*ハンドルを傾けるほど左右のモーターの回転数に差が出るように*/ /* ≒傾けるほどよく曲がるように */ mS=100.0*cos(at+PI_2);
三角関数の辺は数学のお勉強的にはややこしいけど実用できるとすごく便利。こういう時に。
センサーの取り付け方的にそのままの数値を使うと90度ずれた状態で出てくるのでπ/2を足して補正したりとか。 でも授業でアークタンジェントのこんな使い方はしなかったような気がせんでもない。ググって知った。
左右の傾き具合で曲がり具合を変える部分は、横に倒すほどcosが増えるのでその数値を左右のモーターにそれぞれ符号を変えて足してやると横に倒すほど左右のモーターで回転数に開きが出てくる、といった感じです。
まとめと反省と雑記
- 今見るとなんだか不可解な部分がかなりある。やっぱり書いてから2ヶ月半も経つと忘れるなぁ・・・とブログ記事の方もハード編から1ヶ月半も経っていることに深く反省。なんじゃこりゃ。
- 忙しいかというとそうでもないのに更新するかと言えばそうでもない。だらしねぇ・・・何という怠惰生活。高専じゃない3年生だったらこれはやばいし許されない。いや、高専の3年もいろいろとやばい年だけど。
- でもテストは専門科目が増えて平均点が久しぶりに70代行ったりとか景気は良いがふたを開けると最高点と最低点の差が91点とか言うグランドキャニオンなので安心はできないという。
- Googleで捜し物をしていると自分のブログが引っかかる事があるけど、何もないのは分かってる(書いた覚えがない)ってのがイライラする。引っかかるならなんか情報出せやってね。だから手に入れた情報は全部ネットに置いといて還元しないといけないなぁーと思う。こういうのとかロボコン関連の技術情報とか。wikiでも建てるかな?。。。
- そう言う意味でエントリー化する基準をもっと下げても良いのかなー。大昔厨二病の症状で始めた時(2006年?)のエントリーはほんとにどうでもいい日記だけだったからそれからどれだけ閾値を上げるか様子見してたらtwitterとかtumblrとかで細々した話題は済むようになっちゃって本当にブログに書くのはでかい話題しか無くなった。
- でも、でかい話題の中に埋もれてる事(今回でいえばXBee周りとか)とかがばっさり切り落とされてるからそれではまずい。情報源として役に立たない。
- そんなわけで、どうすればKnowledgeBase的なものが作れるか思案中。やっぱWikiかなぁ・・
[うp]wiiハンドルもどきでロボットを動かしてみた[回路編]
食らえ!ニコニコの限界画質!!!
・・・画質が良いのは良いけど、重いなんてもんじゃねぇよこれ。。ちなみに測ったら1042Kbpsだった。
ブログに解説を書くと動画の方に書いちゃったので以下解説
・動機
研究室に鎮座している人型ロボットを動かそうと思って、手に使うちっちゃいサーボとか無線モジュールとか加速度センサとかいろいろ買ってたので、まず無線からやってみるかと思って着手したものの、2つある片方がぶっ壊れて一時中断。次に加速度センサーでもやるかと思って、ブレッドボードの真ん中にセンサーを置いたら良い感じにハンドルっぽくなって気がついたらいつの間にかレースゲーが出来てたという流れ。
でもやっぱ画面の上のお友達ではロボコンチーム的に許されないと思ったのでちゃんと画面の外でロボットが動くようにしたのがこれ
・何故うpした
部活勧誘会でお披露目したら新入生たちから世間の冷たい視線を浴びせられたのでついカッとなってやった。反省はしていない。正確に言うと新入生以外からも冷たい目線で見られたような気がしたが気にしない。
新歓モード。この下にあれが入っている。
ちなみに羽は電飾されてて埋め込まれてるLEDが光ります(白鳥っていうと学校ばれそうな気がするがどうなんだろ)
・具体的な仕組み
・加速度センサ周り
使用しているのは秋月で買える3軸加速度センサ。やっぱり5v入力対応してるってのは良いですね。プロトタイピングのときは5vってのは都合が良い電圧なので。(電源装置が使用中でも空いてるUSBポートから5vが取り出せるから)
このそれぞれの軸の出力をPIC12F675でADコンバート、データをUARTでXBeeに送っています。
真ん中が加速度センサ。右にPIC。左にレギュレータ。上はXBee。
ブレッドボードとはいえ見せ物だから部品をシンメトリーに配置した上でなるべく綺麗に配線してみた。
・駆動系周り
自作XBeeシールド+Arduino 2009+TA8429(x2個,右側)
こっちはかなり無茶苦茶な回路。なんというスパゲッティ。白・黒のペアになったケーブルがPWM用で、確かTA8429の出力をON/OFFする12番ピンにつながっています。
本当はArduinoのTXピンをXBeeのDINにつなぐときレベル変換(5v->3.3v)にしなくちゃいけないんですが、抵抗で分圧して適当にごまかしています。前はその辺に気付いていなかったんで5vを適当につないでしまったり、更にモータードライバのノイズも原因になって見事にXBeeが死亡しました。
だから本当はモータードライバと共存させたくないしきちんとしたレベル変換の出来るシールドが欲しいんですけどね。。
いっぺんここで記事切ります。ソフトウェア編はまた後日。

miyabo (miyabo) on Twitter
みやぼーたんぶら