なんとなくARゴーグルっぽいものを自作してみた話。

 どーも。謎デバイスを作ったちさとです。なんか去年の年末になぜかARゴーグル?を作ろうと思ったので作りました。

 仕組みとしては、iPhoneの画面を反射板(100均の下敷き)で反射させてそれを見る感じです。
Untitled Diagram

 これを最低限のフレームで作るとこうなります。ady1d-n9xvg
 スマホの台と下敷きを固定するためのフレームです。適当にFusionでモデリングして3Dプリンタで印刷しました。フィラメントが赤いのは、フィラメントを買ったタイミングで一番赤が安かったからです。他意はありません。

 また、最初はメガネ型にしていたのですが、思ったよりもiPhone6が重く固定できなかったので、アマゾンで売ってたやすいスマホVRゴーグルを分解して作りました。
 

 これがいいように働き、眼鏡をかけたまま使用することができます。メガネの民でコンタクトをしない私にはちょうどいいです。

 実際に見てみるとこんな感じになります。a7sdw-s58vk

 実際に目につけてみても、多少焦点距離が近いですけど焦点が合わなくもないですし、つけたまま遠くを見てもある程度ぼやけはしますが見えるので満足しています。

 まあそんなこんなでなんか自分の中で満足したのでここで終了です。もとはサークルの計器をこれに表示できたらかっこいいと思っていたのですが、どう考えてもヘルメットの中に入らないので諦めました。いつかKV-40を作れる時が来たら発展させてかっこいいyつを作ってみたいです。それではまた今度。

千石で売ってた接触位置センサを使ってみた話

 なんか最近ブログの閲覧数がやたら多くて困惑しているちさとです。ドーモドーモ。前々から欲しかった思い通りのセンサーを千石で買うことができたので紹介します。

 前から一次元のタッチ位置がわかるようなセンサーが欲しいと思っていました。この時の記事で使っていたライブラリを見ると、digitalピン二本で端子間の接触位置が取れるようなことが書いてあるのですが、うまくいかないので行き詰っていました。
 しかし、最近千石に行ってセンサーがたくさんかかっているラックを見ていたらこんなものがありました。

akygr-w451y
 接触位置センサという名前を見た瞬間自分が探していたものだと思い即決しました。


 そんなこんなで目的のセンサーを入手することができたので試しに動かしてみました。回路としては、端子を左に向けて上から(三角のしるしがついている方から)VCC,出力,GNDです。また、出力は10kΩくらいの抵抗でプルダウンしてください。

 プログラムはただanalogReadで読み取るだけでだいたい0~1023がほぼ比例して出てきます。
 LCDはこのブログでたびたび出てくる例のやつです。動画を見ていただけるとわかる通りいい感じにタッチ場所が表示できてると思います。

 今回はここまでです。これを使ったなんやかんやは、年末年始で作っていたクソダサなんちゃってARゴーグルのあと、時間があったら作ってみようと思います。それではまた今度。

ダヴィンチmini w+が壊れた話

 最近、うちの3Dプリンターがうまく動かなくなってしまったのでその戒めにブログにしようと思います。

 うちでは下のdavinci mini w+を使っていました。今年度の初めごろに家で使える手頃な3Dプリンターが欲しくなったので導入したものです。

 これは、買ったままある程度使えて、ある程度知られているダヴィンチで、そこそこ精度が良いので便利に使っていました。しかし最近になり、フィラメントがうまくノズルから出てこなくなり、印刷もフィラメントのアンロードもできなくなってしまいました。また、印刷の途中でフィラメント異常のエラーが出て止まってしまうようになりました。
 まあ、このまま放置するわけにもいかないので、ある程度強引に解決することにしました。

①エクストルーダーの掃除
 まず、エクストルーダーの掃除をします。エクストルーダの中にフィラメントのカスがたまってると、うまくプリントができないことがあります。
 今回は、フィラメントのアンロードができなかったのでエクストルーダ側のガイドチューブを外し、エクストルーダの上ギリギリでフィラメントを切ってしまい、ノズルクリーニングモードで強引に押し出しました。そうすればエクストルーダに邪魔なものはなくなるので普通にクリーニングしました。

②フィーダーの掃除
 次にフィラメントをリールから引っ張り出すフィーダーの掃除をしました。フィーダーが汚くてもうまくフィラメントを送ることができず印刷できません。
 これはxyzプリンティングのページにあるようにして行いました。

③プリンターの校正
 ここまでやって動かしてみたところ、ノズルとプラットフォームが近すぎる気がしたので校正をかけた後、Z軸オフセットを上げました。


 これらの作業をしたところ、うまく動くようになり今のところ問題なく使えています。今回色々いじっていてわかったのですが、もうすでに280時間ほど稼働していたのでもっと労って使ってあげようと思います。また今回の不具合を踏まえて、これからは印刷が終わったらノズルクリーニングをし、フィラメントを抜いておこうと思います。それではまた今度。

センサー付きブラシレスモーターを回した話

 Ene1-GPも終わりもうそろそろ一年が終わりそうな今日この頃、来年の大会のためにもブラシレスモーターの制御を始めることにしました。うちのサークルで使っているモーターは、ブラシレスモーター でかつセンサーがついているので、今回はそれと同じ構造のモーターをAmazonで買い回してみました。

 全然関係ないんですが、fritzing有料化しました? ダウンロードページのデザインが変わっていて、無料ダウンロードのリンクがみつからないんですよね。何か知っている方がいたら教えてください。

 今回使ったモーターはこういうやつです。

 実際に買ったやつは在庫がないらしく検索ではヒットしなかったですが、こんな感じのやつでした。

 システムの概略としてはこんな感じです。
Untitled Diagram
 いつものvvvfを使い、その制御にブラシレスモーター からのセンサー入力を利用する方法をとっています。
 追加された回路はこんな感じです。
brushless_回路図
 モーターのセンサーの取り扱い回路とセンサーの値で決まるステップ表示用のLEDを増やしただけです。

 今回もプログラムは特筆すべきところがないのでコメントだけつけて最後に書いておきます。

 実際に回してみるとこんな感じです。

 まあほどほどにいい感じじゃないでしょうか? ただ問題があって、ブラシレスモーターはやたらと電流が流れるのでブレッドボードが溶けました。 まあ高校生の時に先生の前でVVVFを動かしてブレッドボードを溶かしたこともあるし問題ないです。ただ、このままで良いわけでもないのできちんと基板を作ろうと思います。それではまた今度。

見る価値があるか怪しいプログラムです。一応少しだけコメントをつけておきます。
#define thre 200

int nstep;
int bstep;
unsigned long timeset;
int delaytime;

void setup()  {
  Serial.begin(9600);
  //各出力ピンのモードを出力に設定
  pinMode(2, OUTPUT);//インダクタ接続
  pinMode(3, OUTPUT);//
  pinMode(4, OUTPUT);//
}
void loop()  {
  //センサーの値を見てステップを判断
  Serial.println(delaytime);
  if (analogRead(0) > thre) {
    if (analogRead(1) > thre) {
      if (analogRead(2) > thre) {
        nstep = 1;
      }
      else {
        nstep = 2;
      }
    }
    else {
      if (analogRead(2) > thre) {
        nstep = 3;
      }
      else {
        nstep = 4;
      }
    }
  }
  else {
    if (analogRead(1) > thre) {
      if (analogRead(2) > thre) {
        nstep = 5;
      }
      else {
        nstep = 6;
      }
    }
    else {
      if (analogRead(2) > thre) {
        nstep = 7;
      }
      else {
        nstep = 8;
      }
    }
  }

  
  //現在のステップを表示
  switch (nstep) {
    case 4:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      break;

    case 2:
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      break;

    case 6:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      break;

    case 5:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      break;

    case 7:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      break;

    case 3:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      break;

    case 1:
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      break;

    case 8:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      break;
  }


  //ステップの切り替えタイミングを計算
  if (nstep != bstep) {
    delaytime=(millis()-timeset)/5;
    timeset = millis();
  }


  //VVVFを駆動
  if ((millis() - timeset) > delaytime) {
    switch (nstep) {
      case 4:
        analogWrite(9, 250);
        analogWrite(10, 250);
        analogWrite(11, 0);
        break;

      case 2:
        analogWrite( 9, 0);
        analogWrite(10, 250);
        analogWrite(11, 0);
        break;

      case 6:
        analogWrite( 9, 0);
        analogWrite(10, 250);
        analogWrite(11, 250);
        break;

      case 5:
        analogWrite( 9, 0);
        analogWrite(10, 0);
        analogWrite(11, 250);
        break;

      case 7:
        analogWrite(9, 250);
        analogWrite(10, 0);
        analogWrite(11, 250);
        break;

      case 3:
        analogWrite(9, 250);
        analogWrite(10, 0);
        analogWrite(11, 0);
        break;

      case 1:
        break;

      case 8:
        break;
    }
  }
  bstep = nstep;
}
/*センサーの値とステップの関係
   HHH 1
   HHL 2
   HLH 3
   HLL 4
   LHH 5
   LHL 6
   LLH 7
   LLL 8
*/
/*ステップの流れる順番
   4 2 6 5 7 3
*/

Ene-1GP MOTEGIに行ってきた話

 私はReUsというサークルに入っていて、その活動をたまにしていることはこのブログでも度々触れていますが、今回はその大会があったので行ってきました。

 まずサークルとしての大会の結果を書くと、予選敗退でした。この大会は1ラップのタイムの予選の後、一時間の耐久レースがあるのですが今回私のサークルでは予選突破タイムの15分を切ることが出来ませんでした。
 最大の原因は電池ボックスの接点不良です。先週末(11/23)は茂木では一日中雨が降っており、そのせいで機体および電気系統は常に濡れてしまうような状態でした。また事前から予兆はあったのですが、使用開始から三年目に入る電池BOXのバネや配線が弱くなっており、それが当日になって弾けました。
 当日会場に行ったところ、それまで入っていたコントローラの電源が入らず、入ったとしても電圧が低くモーターを回すことが出来ない状態でした。これはバネの間にマステを挟んだり、配線を強引にはんだ付けしたりしてどうにか動くようにして車検を通過しました。
 しかし、実際のレースになるとコースに出て行く際の段差で電池が外れてしまい、2系統あるうちの1系統の電源が使えない状態になってしまいました。そのため出力電流が低くなり、思うように走れませんでした。

 まあそんなこんなでサークルとしての結果はあまり良くありませんでしたが、私個人の担当箇所の一つである表示計器と賑やかしはある程度の結果でした。レース本番ではコードが脱落して起動しなかったり、そもそも取り付けていたケースが脱落したり、散々な結果でしたがそんなものはすべて雨が悪いということにします。
 今回は表示計器をなるべく単純に作りたかったので、LCDに経過時間と自機速度だけ表示するようにしました。去年は電池電圧と電池温度を表示していたのですが、使うことがなかったので今回は削りました。そのため今回はarduino一台で測定表示装飾を行うことに成功しました。
 今回の基板はこちら。
ene1-2019_ブレッドボード
 なんか説明することもないんですが、LCDはこれをつかっています。また、ブレボ上右にあるDIP基板は前回のmp3プレイヤーです。イルミネーションLEDと書いているものは千石で売っていたジャンクテープLEDです。またホール素子はタイヤについた磁石で作動させて速度計にしました。左の四つのスイッチでmp4プレイヤーで流す音を変えています。

 次にプログラムを紹介しますが、つまらないので最後の方に置いときます。

 実際に動作させた場合はこちら まあいい感じにゲテモノで良いんじゃないでしょうか。
 
 今回はここまでです。ReUsは非公式なので全額自己負担なのがつらいです。使っている自転車のインバーターはあまり性能が良くないらしいので、ちゃんとブラシレス用のインバータを作ろうと思います。それではまた今度。

↓[プログラムです]↓
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "SoftwareSerial.h"
#include "DFPlayer_Mini_Mp3.h"

LiquidCrystal_I2C lcd(0x3F, 16, 2); // I2C: 0x3F, 16x2 LCD
SoftwareSerial mySerial(12, 13); // RX, TX

int v, c;
int pi[360];
int mode;
unsigned long timeset;
unsigned long beforetime;
int V;
float velo;

void setup() {
  lcd.backlight();
  lcd.init();
  delay(2000);
  mySerial.begin (9600);
  Serial.begin(9600);
  mp3_set_serial (mySerial);
  mp3_set_volume (100);
  for (int i = 0; i < 180; i++) {
    pi[i] = 255 * sin(PI * i / 180.0);
  }
}

void loop() {
  if (analogRead(0) >= 1000 && v == 0) {
    mp3_play (2);
    mode = 2;
  } else {
    if (analogRead(0) >= 500 && v == 0) {
      mp3_play (3);
      mode = 3;
    } else {
      if (analogRead(0) >= 300 && v == 0) {
        mp3_play (4);
        mode = 4;
      } else {
        if (analogRead(0) >= 200 && v == 0) {
          mp3_play (5);
          mode = 5;
        }
      }
    }
  }

  if (analogRead(2) > 500) {
    timeset = millis();
   lcd.setCursor(0, 1);
      lcd.print("                ");
  }

  if(V==0 && analogRead(1)>100){
    velo=((22*2.54)*PI)/((millis()-beforetime)/1000.0)*0.036;
    V=1;
    beforetime=millis();
    //Serial.println("A");
  }
  if(analogRead(1)<100){
    V=0;
  }
  
  int mini = (millis() - timeset) / 1000 / 60;
  int seco = (millis() - timeset) / 1000 % 60;

  lcd.setCursor(0, 0);
  lcd.print(velo);
  lcd.print("km/h   ");
  lcd.setCursor(0, 1);
  if (mini > 9) {
    lcd.print(mini);
  } else {
    if (mini > 0) {
      lcd.print(" ");
      lcd.print(mini);
    } else {
      lcd.print(" 0");
    }
  }
  lcd.print("m");
  lcd.setCursor(5, 1);
  
  if (seco > 9) {
    lcd.print(seco);
  } else {
    if (seco > 0) {
      lcd.print(" ");
      lcd.print(seco);
    } else {
      lcd.print(" 0");
    }
  }
  lcd.print("s");

  
  if (mode != 0) {
    v++;
    if (mode == 2 && v > 30) {
      mode = 0;
      v = 0;
    }
    if (mode == 3 && v > 30) {
      mode = 0;
      v = 0;
    }
    if (mode == 4 && v > 30) {
      mode = 0;
      v = 0;
    }
    if (mode == 5 && v > 30) {
      mode = 0;
      v = 0;
    }
  }

  c++;
  analogWrite(11, pi[c % 360]);
  analogWrite(10, pi[(c + 120) % 360]);
  analogWrite( 9, pi[(c + 240) % 360]);
  analogWrite( 6, pi[c % 360]);
  analogWrite( 5, pi[(c + 120) % 360]);
  analogWrite( 3, pi[(c + 240) % 360]);
  delay (10);
}

ArduinoでDFPlayer mini 使って.mp3の音楽を流した話。

 今回はタイトル通りアマゾンで安く売ってたDFPlayer miniというものを使ってArduinoでmp3を流した話です。



 このDFPlayerというものですが簡単に言うと、Arduinoで操作できるmp3プレイヤーのようなものです。今回はこの使い方を説明していこうと思います。

・回路
 まず、下のように配線します。後でプログラムを見るとわかりますが、D10,D11はシリアル通信で使っています。このとき、このモジュールのI/Oは3~4V程度を想定しているそうなので、1kΩ抵抗を入れた方が良いそうです。まあ入れなくても動きます...(電源だけ3.3Vにしたほうが音質がいい気がします)
Untitled Sketch_ブレッドボード


・プログラム
 まず、ここhttps://github.com/DFRobot/DFPlayer-Mini-mp3)からライブラリをダウンロードしzipを解凍した後、中にある「DFPlayer_Mini_Mp3」というファイルをArduinoのシステムフォルダのLibraryに入れます。そうしたらArduinoに下のプログラムを書き込みます。
  1. #include "SoftwareSerial.h"
  2. #include "DFPlayer_Mini_Mp3.h"

  3. SoftwareSerial mySerial(10, 11); // RX, TX

  4. void setup () {
  5. delay(2000); //モジュール起動の待機時間
  6. mySerial.begin (9600);
  7. mp3_set_serial (mySerial); //set softwareSerial for DFPlayer-mini mp3 module
  8. mp3_set_volume (20);
  9. }

  10. void loop () {
  11. mp3_play (1);
  12. delay (60000);
  13. }

・ファイル
 このモジュールに入れるmicroSDカードに下画像のように"mp3"というフォルダを作り、その中に"0001","0002"のように番号付けしたmp3ファイルを入れます。

キャプチャ



 これらの準備が整ったら実際にSDカードを挿して動作させてみます。うまくいっていれば、下のツイートのようにスピーカーから音楽が流れるはずです。

 今回はここまでです。次は二足歩行の続きでも作れたらよいと思います。それではまた今度。

2020/10/13更新 多分プログラムが読みやすくなったはずです。

二足歩行の機構を試した話

 前回の機構を発展させて二足歩行の機構を作ってみました。

 サーボ配置などをスタイルがよくなるように変更した結果重心が高くなりました。
 その結果、片足を上げたときにふらついてしまって安定しなくなりましたが、今のところ問題ない範囲です。

 動かすとこんな感じです。

 いま、fusionでスカルプトを使い足のカバーを作っているのですが、フォームの編集のタブが開かなくなり進んでいません。先に上半身の作り始めたほうがいい気がしてきたので、次は上半身になるかもしれません。それではまた今度。

四足歩行ロボットを作った話

 なんとなく四足歩行ロボットを作ってみたので書きます。


キャプチャ (1)
 こんな感じのものをFusionで作り、3Dプリンタで印刷しました。

 プログラムはこちら
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 4096)

void setup() {
  analogWrite(13, 255);
  Serial.begin(9600);
  Serial.println("8 channel Servo test!");

  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  delay(10);
}

void loop() {
  servo_write(0, 30);
  servo_write(6, 90);
  delay(100);
  servo_write(1, 80);
  servo_write(7, 40);
  delay(100);
  servo_write(0, 60);
  servo_write(6, 60);
  delay(100);
  servo_write(1, 60);
  servo_write(7, 60);
  delay(100);
  servo_write(0, 40);
  servo_write(6, 80);
  delay(100);
  
  servo_write(4, 30);
  servo_write(2, 90);
  delay(100);
  servo_write(5, 80);
  servo_write(3, 40);
  delay(100);
  servo_write(4, 60);
  servo_write(2, 60);
  delay(100);
  servo_write(5, 60);
  servo_write(3, 60);
  delay(100);
  servo_write(4, 40);
  servo_write(2, 80);
  delay(100);
}

void servo_write(int n, int ang) {
  ang = map(ang, 0, 180, SERVOMIN, SERVOMAX);
            pwm.setPWM(n, 0, ang);
}

 いつものごり押しです。
 動かすとこちら

 まあまあな出来になりました。次回は、今作っている二足歩行ロボットの途中経過にしようと思います。それではまた今度。

モーターを鳴らしてみた話2

 今回はスピーカー出力からモーターを回しました。

 今回は簡単にこんな感じの回路を作ってみました。

1
 イヤホンジャックからの入力をオペアンプで増幅し、それでFETを操作しています。そうすることで、モーターがスピーカーのような働きをしてくれます。

 ちなみに使ったモーターはこちらです。



 配線して実際に流してみるとこんな感じになります。
 低周波の音は出にくいのです。ただ、思ったよりいい音が出ているので良かったです。

 今回はここまでです。次回は130モーターで合奏をしようと思います。それではまた今度。

4Kモニターとリンクケーブルの話

 私は今までデュアルモニター+MBAで開発などをしていましたが、いろいろな問題がありました。具体的に挙げると
①ラップトップとデスクトップの間でのデータ管理がめんどくさいこと
②ラップトップを置く場所が椅子から遠く操作しにくいこと
③デスクトップのモニターが小さく、画質が悪いこと
などの問題がありました。それらの問題が煩わしく思っていた時にちょうど夏休みが来て時間にもお金にも余裕ができたので、この度いろいろ買ってその辺の調整を行いました。

 まず、私のパソコン事情を説明します。
 ラップトップはMacBook Air mid2015なので、第五世代のi5と4GBのRAMの構成で、軽いプログラムはかけるのですが、CADとかを動かすのは少しつらいスペックです。
 デスクトップは第八世代のi7とGTX1080Tiに36GBのRAMが刺さっているのでムキムキのPCです。私の用途では何をさせても快適に動きます。
 また、机が大きくないのでキーボードやマウスを複数用意して利することはできませんし、部屋を一人で使っているわけではないので机を変え変えたりすることは厳しいです。


 次に、それぞれの問題を解決していきます。

 問題①②についてはリンクケーブルというものを使ってしまえば解決できます。これは両端にUSBが付いたケーブル上の機械で、両端の端子を二つのパソコンにつないで使います。パソコンにつなぐとUSBドライブとして認識され、その中のexeファイルを実行するだけで使えるようになります。このような簡単なセットアップだけで一つのマウスやキーボードで両方のパソコンを操作できるようになるほか、ドラッグ&ドロップだけでファイルを移動できるようになるのでとても便利なものです。
 今回自分は

これを買いました。これより安いものもあるんですが、USB2.0だったりしたのでUSB3.0の中では安かったので今回はこれを買いました。現在この記事をデスクトップに刺したマウスとキーボードを使ってラップトップで書いているのですが、遅延などもないですしとても使いやすいです。また、クリップボードも共通なので二つのパソコンをまたいで作業するときもとても便利です。

 問題③については、使っているモニターが



これなので、画質が低く動画を見たりゲームをしたりすると少し気になります。ただ、作業用として使えば全く問題なく、とても安価で小型なので、メインモニターの横に置くといいかもしれません。まあそんなこんなでいいディスプレイを買うことにしました。私はまあまあPCゲームをするのですが、主にやるゲームはシミュレーションゲームなので60FPSぐらいのモニターで十分だと思い...



このモニターを買いました。一応ゲーミングな4Kモニターで1ms60fpsなのでそこそこFPSなどもできるのではないでしょうか? はじめて4Kモニターを買ったんですが、画質が良すぎてFHDに戻れない体になってしまいました。前まで使っていたモニターがあれなので全く参考になりませんが、OverWatchとWoTをやってみたところ、ものすごくきれいな画面でものすごくぬるぬる動きました。ただ、OverWatchはウルトラ設定の上のエピック設定ではGTX1080Tiが耐え切れず、30fpsぐらいまで下がってしまいました。ウルトラ設定にすればちゃんと60fpsに張り付くのでとても快適です。


 そんなこんなでデスク周りはこのようになりました。DSC01286
 椅子に座ると視界の8割がモニターになる素敵なデスクになりました。左にある二枚のモニターが前からあるやつで、右にあるのが新しく買ったモニターです。私はモニターがたくさんないと安心できないので、とても落ち着くいい作業環境です。


 これで作業環境としてはとてもいいものになりました。QOLも上がったので次はこの間中国から届いたモーターでも使ってみようと思います。それではまた今度。
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

読者登録
LINE読者登録QRコード