2016年2月23日火曜日

高精細な3Dバーサライタその4

こんばんは

 先日、ドットマトリクスが1周期あたり1回しか表示されない問題があり、マイクロスイッチをもう一つ取り付けることによって改善すると投稿しました。

 しかし、よくよく考えてみると、作成していたプログラムは2回目の表示が終わった後、無限ループに突入し、その無限ループがスイッチの検出によって抜けられるという使用になっていました。そのため、1回目のドットマトリクスの表示中、2回目の表示までの間、2回目の表示中にスイッチが押された場合、その押された信号をとり逃していました。

 そこで、結論としましては、スイッチの検出を割り込みによって実現することにしました。考えてみればすごく単純なことなのですが、なぜか今まで気が付きませんでした。なんにせよ、スイッチ一つでも、きちんと1周期あたり2回の表示ができるようになりました。



とりあえず、このように表示されるようになりました。少し、2重になってしまっているところがあるのは、タッチセンサが完全に終端で検出するわけではないためです。きれいに表示させるためには、タッチセンサが触れてからの待ち時間を調節する必要があります。
 これで、一応プログラムの方は大方完成となります。ただ、たまに、予期しない表示があったりするため、その点を直したら、ソースを公開しようと考えています。
 
一応、割り込み部分のソースをあげておきます。
#include <avr/pgmspace.h>

void setup() {                
  
  //ピン設定

  attachInterrupt(2, change_sw, RISING);//割り込み(21番ピン)
}

volatile int state = 0;

void loop() {

  //処理

}

void change_sw()
{
  state = 1;
  delay(30);//チャタリング防止
}
 
 
参考にしたサイト
Arduinoリファレンス attachInterrupt()


2016年2月21日日曜日

高精細な3Dバーサライタその3

こんばんは
とりあえず、マイクロスイッチによる同期によって、立体を表示させることには成功しました。

しかし、まだ何点か問題があります。
  1. 動作速度が遅いため、シャッタースピードを遅くして写真を撮らないとうまく立体表示できない
  2. 本当はモータ1回転当たり、2回表示できるが現在は1回
まず1の問題に関してですがモータの回転数を上げること以外に改善のしようがありません。ただし、1周期あたり2回表示できるようになれば、モータの回転数を2倍にするのと同義なので、今後はその方向性で行こうと考えています。

 次に2つ目の問題に関してですが、これはタッチセンサをもう片側にもつけることによって行おうと考えています。
 ドットマトリクスをきれいにちらつきなく表示するためには、非常に早い周期で点滅を行う必要があります。今回そのための措置として、AVRのレジスタそのものに指令を与えています。これにより、通常のdigitalWrite関数を用いるよりはるかに高速動作させることが可能となります。そこで、その高速なループを有効に活用するため、ドットマトリクスのループの中に、動作の遅い関数を入れる訳にはいかず、スイッチの検出はドットマトリクスがすべて消灯した後に行っています。

 そのため、1周期で2回表示させるための折り返しまでの時間を測るのが遅くなってしまい、何回か往復させないと、同期をとることが困難になっています。
 したがって、その改善策として、両端で検出を行うことで、同期をとるまでの時間を早くしようと考えています。もしかしたらもっといい、改善策があるのかもしれませんが、今後はこの方針でとりあえず行くつもりです。
 
それでは

2016年2月18日木曜日

高精細な3Dバーサライタその2

 前回に引き続き、バーサライタを作っています。

 前に製作したバーサライタは、同期をとるためにフォトリフレクタを用いていました。しかし、フォトリフレクタによる読み取りでは、アナログ値を読む必要がありました。また、デジタル信号として読み取るとしても、半固定抵抗などを用いた細かな設定が必要となっていました。

 そこで、今回は光学スイッチを用いるのをやめ、マイクロスイッチを用いて同期をとることにしました。

 早速、3dプリンタでマウントを作成しました。

 円の部分をレールとなる棒に通して使います。3dプリンタでABSを用いて作成するとある程度の弾性を持たせることができます。私の3dプリンタの場合には0.2mmほど穴を大きく作るとぴったりとはまるようです。この値は、個々の3dプリンタによって違うかもしれません。

 こちらが、筐体に取り付けたものになります。

 このように、表示部が往復運動する際に、一度だけスイッチに触れるようになっています。これで、一応電気系統に関しては終了となります。

 今現在、サンプルのプログラムを作っているところなのですが、Arduinoの命令がどうやら、そんなに早くはないようで、あまり早い周期では、表示が追い付いていません。そこで、プログラムを見直しています。改善できればいいのですが...

高精細な3Dバーサライタその1

 前回、といっても1年近く前のことになってしまいますが、3次元表示のバーサライタを作成しました。
しかし、前回作成したバーサライタには様々な問題がありました。
  • ドットマトリクスが8×8と非常に粗いこと
  • ドットマトリクスを回転させるため、表示させる立体がゆがむこと
がありました。

 そこで現在、ドットマトリクスを32×32に拡張し、水平に往復運動させるようなバーサライタを作成しています。

 ただし、前回はArduinoのピンでドットマトリクスをそのまま制御することができたのですか、さすがに64本のピンはないのでシフトレジスタを用いることにしました。
 シフトレジスタには74HC595を用いています。
 このシフトレジスタを用いることで、クロックピン、データピン、ラッチピン、(リセットピン)の3本ないしは4本でドットマトリクスを制御することが可能となります。

 ただし、今回は高速化のために、行と列でシフトレジスタを分けたため、8ピンで制御しています。

 また、シフトレジスタだけではLEDを複数光らせるのに十分な電流を流せないため、トランジスタアレイを用いています。
こちらが、まだ途中ですが、ドットマトリクスを表示させてみたものです。

 とりあえず、指定したピンを光らせることに成功しました。

 今回、ドットマトリクスを光らせるために、32×32の配列を作ってデータを入れていたのですが、ArduinoのSRAMがどうやらオーバーフローしてしまうようで、フラッシュメモリにデータを書き込んで、読みだしてくる必要がありました。

 実際、ドットマトリクスのデータなど非常に大量のデータを書き込む際にはSDカードなどに保存して、処理の合間に呼び出すような仕組みが必要なのかもしれません。

2016年2月9日火曜日

アナログカウンタによる時計作成

 前回の投稿から1年以上たってしまったのですが、これからはもう少し早いペースで更新していきたいと思います。

突然ですが、ジャンク品としてアナログカウンタを入手したため、時計(ストップウォッチ)を作ってみました。外観がこのような感じです。


アナログカウンタを暇なときにカチカチといじっていた時に、なんか時計っぽいなと思い作ってみることにしました。アナログカウンタをサーボで一定間隔ごと押して数字を変えていく仕組みです。


外装は3Dプリンタを使って作っています。また、今回は細かい穴をパテで埋め、その後何回かサーフェイサーを吹いて表面を滑らかにしています。またこの動作がこちらの動画です。



このよぅに、1秒ごとにカウンタを押していく簡単な仕組みです。ただ秒から分への桁上がりに関しては、早送りさせることによって実現しています。しかし、サーボの動作速度が低速なため、60秒から次の秒数まで行くのに非常に時間がかかってしまいます。
もう少し、速いサーボが手に入ったらもっと高速な桁上げを実現したいです。
以下ソース
#include <Servo.h> 
Servo servo;

int num=0;

void setup() 
{ 
  servo.attach(6);
  Serial.begin(9600);

} 

void loop() {
  double dob_kai;
  int kai;
  for(int a=0;a<10;a++){//時
    for(int b=0;b<60;b++){//分
      while(1){
        dob_kai=millis();
        kai=dob_kai/1000+(b*40)+(c*4000);
        counter(kai);//秒表示
        if((((kai/10)%10)*10+(kai%10))>60){
          break;
        }
      }
    }
  }
}

int counter(int x) {//クロック表示用関数
  int i;
  for(i=0;i<x-num;i++){
    servo.write(80);
    delay(200);
    servo.write(20);
    delay(200);
  }
  num=num+i;      
}



参考にしたサイト
Arduinoで始めるロボット制御
http://www.vstone.co.jp/vs_wiki/main/wiki.cgi?page=Arduino%A4%C7%BB%CF%A4%E1%A4%EB%A5%ED%A5%DC%A5%C3%A5%C8%C0%A9%B8%E6

ソースの表示に関して
何かをやりたい何かになりたい bloggerでSyntaxHighlighterを表示する方法
http://trueman-developer.blogspot.jp/2015/10/bloggersyntaxhighlighter.html