2017年11月18日土曜日

twitter始めました

途中経過じゃないですスイマセン

投稿するほどでもないけど共有したいことがけっこうあったのでtwitterを始めました(サブアカですが)。

アカウントはこちらから

もちろんきっかけは界隈で有名なペットボトルロケット迫撃砲の人が始めたからです。

工作、プログラミング、PCその他のモノづくり一般に関するツイートが多くなると思います。OpenCVとかArduinoなどわかる範囲でDMでお答えします。
よかったらフォローしてください。

2017年7月20日木曜日

RSS実験機「Aries」製作記⑨

お久しぶりです

なかなか地味な作業ばかり続いていて投稿するタイミングを逃していました。
地味ですが完成にはだいぶ近づきました。
今回行った工程は以下の通りです。

①前回壊れた機関部作り
②弾受けの接点素材変更
③弾受けのロープ交換
④スコープ到着と可変マウント制作
⑤レール延長

相変わらずバイス無し、グラインダ無し、ボール盤無しのほぼ全手動でお送りします。

①前回壊れた機関部作り

最初はアルミ部分だけ変えるつもりだったのですがケースも作り直すことになり、挙げ句固定方法も変わりました。
前回アルミ加工はもうしないといったな。あれは嘘だ。

作り方は
けがく→切る→削る→穴あけ
手作業で糸ノコ、金ヤスリ、電動ドライバで合計3日ほどかかりました。まあ、テスト勉強の合間にちょこちょこ進めたりしてたんですが。

そんなわけでクリアランスの大きい丈夫な機関部ができあがりです。


②弾受けの接点素材変更

前回までは3mmビスを切断して内側からナットで固定するという無駄に器用な方法だったのですが、接点の負担がすごかったので(当たり前)大き目の釘を切断してピンのように固定することにしました。(硬かった…。)

③弾受けのロープ交換

強度、摩擦などの問題で2mmの綿のロープから3mmの十六打ナイロンロープに交換です。末端処理臭かったです。
これにともない弾受けの穴も拡大しました。接着はいまだに接着剤ですが今のところ問題は無さそうです。

④スコープ到着と可変マウント制作

amazonに注文していたスコープが届きました。一緒に注文したベースプレートと12mmアルミレールで可変マウントを作りました。
前回アルミ加工はもうしn(ry
大まかに下のナットで固定し、バネで押し上げながら上のナットで微調整します。
まあ、精度はオモチャレベルです。ロマンですよロマン。


⑤レール延長

足りていなかったレールを延長しました。これも12mmコの字アルミレールです。
前回アルミ加工はm(ry

すべての作業を終えた状態です。

残っている作業は

・トリガーガード取り付け
・弾道調整
・ストック研磨
・塗装

などです。


  • とりあえず制作編ということで実射結果は次の投稿にしたいと思います。

2017年6月10日土曜日

部活で始めるArduino④「シリアル通信編」

コンピューターやほかの機器と連携する

(マウスでモーターを動かせたらな…)
 とか
(コンピューターの近くの気温が知りたい…)
 と思ったことはありませんか?

ArduinoにはUSBポートとシリアル通信の機能が付いているのでとても簡単に実装することができます。
シリアル通信とはUSBケーブル等を通して0と1の信号を送ったり受け取ったりする技術です。かなり歴史のある通信方法でシンプルかつ汎用性が高いです。

では作業に移りましょう。
今回はArduinoに文字を送り、Arduinoの内蔵LEDを点灯・消灯させてみます。

文字を送り、Arduinoの内蔵LEDを点灯・消灯させる

Arduinoでシリアル通信をする場合、数字や半角文字を送るのが一般的です。そこで例えば「a」が届いたらLEDを点灯、「b」が届いたらLEDを消灯することにします。LEDの点灯消灯については部活で始めるArduino① 「入手と準備と確認編」のプログラムを改造することにします。

ここで使用する関数は

・Serial.begin(通信速度)  … 初期化と通信速度の設定(最初に一回実行)速度はパソコン側の設定と合わせる
・int型もしくはchar型変数 = Serial.read()  … 受信済みの1バイトを読込む(何も届いていないときは−1が返る)
・int型変数 = Serial.available()  … バッファに何バイトたまっているかを返す

の3つだけです。

1バイトを読み込むというのがわかりずらいかもしれませんが、1バイト≒1文字と考えてもらえば分かりやすいです。

▽詳しい説明ですが読まなくてもいいです▽
例えばシリアル通信でパソコンから"a b ¥n"(¥nはwindowsで改行を表す文字コードです)と送ったとします。
パソコンが文字列をASCIIコードで16進数に変換、さらに16進数を2進数に変換してUSBケーブルでピコピコーと発射します。
受け取ったArduinoは2進数を16進数(=1バイト)に戻しバッファ(一時置き場)に届いた順にためていきます。
Serial.read()を実行すると届いた順に1バイトずつ読み込まれる、というわけですさらにchar型変数に格納すると逆のルートをたどって文字に変換されます。

プログラムはこんな感じです。



void setup() {
     pinMode(LED_BUILTIN, OUTPUT);
    Serial.begin(9600) ;
}
void loop() {
    char c ;
    if (Serial.available() > 0) {
        c = Serial.read() ;
        if(c == 'a'){
            digitalWrite(LED_BUILTIN, HIGH);
        }
        if(c == 'b'){
            digitalWrite(LED_BUILTIN, LOW);
        }
    }
}

こちらのサイトやArduino日本語リファレンスを参考にしています。

パソコン側の操作は

①Arduinoと接続する
②Arduino IDEのツール→シリアルモニタを開く
③入力して送信ボタンを押す

です。
文字列で送るとバッファに一文字ずつたまって順番に読み込まれます。

a を送ってLEDが点灯し、bを送ってLEDが消灯したら成功です。

このシリアル通信を使えるということは

  外の世界の状況を観測する(センサーやカメラ)
   ↓
  計算や処理を行う(AIやキーボードからの入力)
   ↓
  外の世界に影響を及ぼす(モーターやLED)

の流れができるということです。ほかの技術と組み合わせれば日々の生活やロボコンにも役立てることができます。


シリアル通信はパソコン側のソフトも(比較的)簡単に自作できるので画像処理なんかと組み合わせても面白いと思います。私は二軸のサーボモータの台座にWebカメラを乗せて顔を追いかけてくる装置を部活で作りました。

このページが困っている人の助けになれば幸いです。

2017年4月6日木曜日

RSS実験機「Aries」製作記⑧

玉受け完成

前回機関部がぶっ壊れたので、新規で作りました。もうアルミの加工ヤダ…。
それに伴い玉受けも木製からアルミ製に、レールの配置も変わりました。

とりあえず2㎜のアルミアングルを切り出してやすりをかけます。


左側が玉受けの部品でこの後穴をあけたりして組み立てます。
右側はトリガーとシアーです。


玉受けはアルミ板4枚を表面をやすり掛けして接着剤で張り合わせています。今のところ強度に問題はなさそうです。

左に写っているのはワイヤーです。
玉受けとゴムを繋ぐところに使おうと思っていたのですが、輪を作った時の接合部の強度不足で没です。普通に繊維系のロープ使います。

とりあえず玉受けは完成しました。機関部の方も新しく作り直さないといけないので完成にはもうちょっとかかる予定です。
早く試射したいなあ。

今スコープとレールも配達待ちなので急いで作業したいと思います。

2017年3月1日水曜日

部活で始めるArduino③「サーボモータ応用編」

サーボモータをより精密に制御する

サーボモータの応用編です。
今回は前回1°単位で制御したサーボモータをもっと精密に制御します。

サーボモータはマイコンなどから送られてくるパルスのパルスの幅で角度を決めています。
たとえば前回使ったSG90はこちらによれば
・動作角度 180°
・動作パルス幅 500~2400μs
だそうです。どういうことかというと
※波形は誇張してあります

上の図のようにサーボモータの角度が、ある決められたパルスの幅、つまりONとOFFが高速で切り替わるうちのONの時間に対応しているということです。
500~2400μsなので-90°は500μs、90°は2400μs、0°は真ん中の1450μsに対応します。
前回やった方法では、入力された角度に対応した波形を自動で出してくれていた、というわけです。

サーボモータをより精密に動かすにはこのパルス幅を直接指定してやります。
2400-500=1900 なのでおよそ0.1°の精度が期待できます(実際はもう少し誤差が出ます)。


作業に移りましょう。
パルス幅を直接指定する関数は
  writeMicroseconds(r)  //rはμs単位のパルス幅
です。前回同様Servo.hの中の一つです。

では前回のプログラムを上の関数を使うよう書き換えてみましょう。

-45° → 500(=-90°) + 1900(=180°) × 45°/180° ≒ 975(μs)
45° → 500(=-90°) + 1900(=180°) × 135°/180° ≒  1925(μs)

となるので

#include<Servo.h>       //サーボモータのライブラリをインクルード
Servo servo1;            //servo1というServoオブジェクトを作る

//最初に一度だけ実行
void setup() {
    servo1.attach(9);   //servo1が刺さっているのは9番ピン
}

//setupの後無限ループ
void loop() {
    servo1.writeMicroseconds(975);    //置き換えたところ
    delay(1000);          //1000ms(ミリ秒)=1秒待つ
    servo1.writeMicroseconds(1925);  //置き換えたところ
    delay(2000);         //2000ms(ミリ秒)=2秒待つ
                             //「{」のところに戻る
}

赤くなっているところが置き換えたところです。
同じように動作すると思いますが違いが分かりませんね。

この関数は角度を直接指定する用途より、ある角度からある角度に動かす用途に使った方が輝きます。下のプログラムで確かめてみます。

#include<Servo.h>       //サーボモータのライブラリをインクルード
Servo servo1;            //servo1というServoオブジェクトを作る
int angle,pulse;     //angle : °単位の角度、pulse : パルスの幅//最初に一度だけ実行
void setup() {
    servo1.attach(9);   //servo1が刺さっているのは9番ピン
    angle = 0;     //angleを0にする
    pulse = 0;     //pulseを0にする
}

//setupの後無限ループ
void loop() {
    for(angle=45;angle<=135;angle++){
    servo1.write(angle);
    delay(10);     //10ms待つ
    }     //servo1をangle度にしてangleに1足す処理をangleが135になるまで繰り返す
    delay(10000);    //1秒待つ
    for(pulse=1925;pulse>=975;pulse--){
    servo1.writeMicroseconds(pulse);
    delay(1);     //1ms待つ
    }     //servo1にpulseを出力してpulseから1引く処理をpulseが975になるまで繰り返す
    delay(2000);         //2000ms(ミリ秒)=2秒待つ
                             //「void loop() {」のところに戻る
}

最初が角度単位の移動、次がパルス幅を基準とした移動です。
より滑らかでトルクも高くなることが分かっていただけると思います。

今回はこんな感じです。
正直プログラムに組み込むのはちょっと面倒な代物ですが、カメラをサーボで動かしたりする用途にはいいかもしれません。

次回はシリアル通信機能を紹介します。

2017年1月11日水曜日

RSS実験機「Aries」製作記⑦

機関部がお亡くなりになりました。


それは何度目かの試射の時・・・。平ゴム4本を「ぐぎぎぎぃぃ」と言いながら装填し、的に向けた瞬間、暴発しました。
写真からわかるようにパーツの回転の軸となっていた釘が「く」の字型に曲がってしまい、その後はゴムがかかってもすぐ外れるようになってしまいました。パーツを交換しても数回で同じようになります。

私の機関部は
このような仕組みなのですが(赤い点が回転軸の釘)

ゴムによって矢印のような力がかかって耐え切れず曲がってしまったようです。
これは釘を太くするほかに解決策がないように思ったのですが、図で省略したバネが干渉したり、そもそもいつ曲がるかわからない機関部を使い続けるのはどうかと思うので、新しい方法を考えることにしました。

まず、機構が単純なこと、加工が少ないこと、ゴムの強さに関わらず動作すること、万一壊れても使用者に危険が及ばないことなどを考え、下のようなデザインになりました(シア付けたかった・・・泣)。とりあえずこれで作ってみます。


試射の結果ですがこちらの画像になります。
ゴムはユタカメイク22mm×折径160mm平ゴム、加速距離40cm、パチ玉、一枚目は水缶、二枚目は空です。
アルミビール缶は両面貫通、アルミ蓋付きコーヒー缶は少し切れ目ができた程度です。
おそらく25~27m/sくらいでしょうか・・・。
この後は玉受けとレールを作り直すつもりです。

最後に現在の状態です。



部活で始めるArduino② 「サーボモータ入門編」

サーボモータ入門編

今回はarduinoでサーボモータを動かしてみましょう。

arduinoは単体だとLEDを光らせることくらいしかできないのですが、ピンを使って様々なものと接続することで多くのことができるようになります。

今回はロボットを作ったり動く工作をするのに使われるサーボモータをarduinoで制御してみましょう。



今回はとりあえず動かすことが目的なので
・小さいサーボモータ
・3ピン制御
・簡単プログラム
で行きたいと思います。

まずサーボモータを入手します。
今回私が使用したサーボモータはSG90(¥420)です。一番小さいお手頃なやつです。アマゾンで2日
で届きました。



arduinoとサーボモータのほかに前回使ったUSBケーブルB型、サーボモータと接続するためのジャンパ線(針金でも可)を用意します。


あと前回の投稿を参考にarduinoとPCを接続してプログラムが書き込める状態にしておいてください。PCによっては繋ぐたびにドライバの更新が必要になる場合があります(私の学校のPCがそうでした)。

作業を始めるまえに注意です。サーボモータは普通のモータとちょっと違うので以下のことに気を付けてください。

・手で無理に回さないこと
・製品ごとに決められている角度以上に回さないこと(できれば±3°180°なら3°~177°で運用する)

では早速作業を始めましょう。
まずarduinoとサーボモータを接続します。サーボモータはコードの色ごとに役割が決まっています。

こげ茶→GND(電池でいうマイナス)
→IN(電源、電池でいうプラス)
→制御(デジタル信号で角度の指示を出す)

今回はこげ茶はarduinoのGNDに、赤は5Vに、黄はデジタル出力の9番(プログラムによってはほかの場所でも可)に接続します。
ジャンパ線を互いの端子の穴に深く差し込みます。



接続している間はサーボモータからキュイキュイという音が聞こえるかもしれませんがサーボモータが現在の角度を保とうと微妙に動かしているためで問題はありません。

次は実際にサーボモータを45°から135°に動かしてみます。
以下のプログラムをPCのarduinoIDEに入力して書き込んでください。
(ちなみに//と入れた場所は「その場所からその行の終わりまで無効」ということを表す文法です。無効になるのでそのままコピーして貼り付けてもらって大丈夫です。)

#include<Servo.h>       //サーボモータのライブラリをインクルード
Servo servo1;            //servo1というServoオブジェクトを作る

//最初に一度だけ実行
void setup() {
    servo1.attach(9);   //servo1が刺さっているのは9番ピン
}

//setupの後無限ループ
void loop() {
    servo1.write(45);    //servo1を45°にする信号を出す
    delay(1000);          //1000ms(ミリ秒)=1秒待つ
    servo1.write(135);  //servo1を135°にする信号を出す
    delay(2000);         //2000ms(ミリ秒)=2秒待つ
                             //「{」のところに戻る
}


サーボモータが45°から135°の間を往復しましたか?
失敗した方はこれまでの手順をよく読んで再挑戦してみてください。

arduinoのプログラムはスケッチと呼ばれ、C言語とほぼ同じ文法で書くことができます。
が、ちょっと使うためだけにプログラミング勉強するのは…。という方もいると思います。
そのうち「当てはめるだけでスケッチが書ける表」みたいなのを作るかもしれません。

次回は「サーボモータ応用編」か「シリアル通信編」になります。
この記事がArduinoに挑む方の助けになれば幸いです。