Maker Faire 2014開催中! プラレーン+衝突防止改造ミニ4駆

一日目無事終了しました!
ぶっつけで心配された衝突防止機能付き改造ミニ4駆ですが、
カーブには弱いですが(ジムニーはローラーも搭載していない)
直線では予定の性能を発揮しています。
デモの仕方で工夫していますので
2日目来場される方は是非ご覧下さい。



Maker Faire 2014出展情報1 プラレーン

いよいと明日から、Maker Faire Tokyo 2014始まります!
神村工業も無事審査が通って出展します。
来場の際は是非お立ち寄りください。
個人的には自宅にいる時間があまりに少なくて作品を作ることが出来なかったのですが
仲間や協力者が楽しい作品を用意してくれました。


特にMIRICEさんには、出展スペースの長机に収まるようにシングルの
ミニ4駆レーンのデータ作成と出力をお願いしました。
直線とカーブの2種類のパーツを複数出力して組み合わせることにより
省スペースのシングルレーンコース形成が可能です。
持ち運びが楽なのも嬉しい。
プラレールのようにつなぎ合わせるので名づけて、
「プラレーン」です。

社長からは衝突防止機構付きの改造ミニ4駆を準備してもらっています。
ぶっつけ本番なのでこのコースで上手くいくかどうか、乞うご期待です。
ちなみにスズキジムニーが内部スペースが大きく改造しやすいようです。

MIRICEさんの記事も参照ください。
http://mirice.co.jp/museum/archives/276
データも公開して頂いているので、みなさんも出力可能ですし、
データを改造して坂道などを作ってみてはいかがでしょうか?

https://modelabo.itmedia.co.jp/1620/
https://modelabo.itmedia.co.jp/1621/

POVくっ付けて走ると単純な形なら見えます。


前回好評だった、コボちゃん専用4コママンガリーダー「コボ」も展示します。

http://d.hatena.ne.jp/kamimura_industries/20131101/1383319828

Maker Faire 2014出展準備2 看板作製

居ても立っても居られなくなって、看板だけ光るようにしました。
加速度センサーで傾きで色が変わります。
BLE内蔵で現地でPCからプログラムも変えられます。



来場されたら是非、神村工業もよろしく。

Maker Faire 2014出展準備

sakehitoです。
名刺は毎回自分が用意してます。


おすすめは、A-oneのマルチカード。
・エーワン マルチカード 名刺 両面クリアエッジ 厚口 10シート 51811
・エーワン マルチカード 名刺 アイボリー 10シート 51033


作成も専用ソフトで簡単。
ちぎるのが楽です。
両面クリアエッジは台紙から剥がすだけ。
マイクロミシンカットは山折りと谷折りをすれば外れます。
入手性も良いし、1枚4円程度と数百枚程度の用途なら、
コストパフォーマンスもいいと思います。


厚紙に印刷するのが安いですが、直前に何百枚も切るのは
しんどいので…。
剥がすのは他のメンバーにも朝やってもらいますが。

Maker Faire 2014出展情報4 ハルロック 無駄時間可視化ツール改

ハルロック本家が猫twitterなどで出展されるのでおこがましいのですが
ひっそりと展示しときます。
今のところ今回自分(sakehito)の唯一の作品なので。


・仕様
作中の解説と脳内保管から機能仕様は下記にしました。

・ボタン押下で時間計測をON/OFFし、計測値はATtiny45内のEEPROMに保存する
・計測結果の確認はAttiny45を取り外して、ライター環境で読み出すことで、取得する
 =>長押しで2進数でEEPROMデータ表示(追加機能!)
・1週間バッテリー交換無で動作すること
・未計測時はパワーセーブモードに移行して省電力化すること

・回路図

・部品表

・結果
https://docs.google.com/spreadsheets/d/1EGX-QOQUUa8TQil_8735L1fB2xrmEzw_FKDFe1B-3QM/edit#gid=0

・ソフト
Attiny45をArduino化して下記のように書いてます。
あまりきれいなコードではないですが参考に。

//HARUROCK 9ohm
//2014.7.24
//長押し時に毎回binを点滅表示
//sakehito@ngitigadget

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <EEPROM.h>

//外部割込み端子(D2)にタクトスイッチ接続
#define SW 2  
#define LED 1

#define LOOP_WAIT 1
#define BUTTON_COUNT 40
#define BUTTON_WAIT 32
#define BUTTON_LONGWAIT 150
#define STOP 0
#define START 1
#define EEPADD 0

unsigned long now1 = 0, now2 = 0;
unsigned long wastetime = 0;
unsigned long newtime = 0;
unsigned char swcount = 0, initial_flag = 0;
byte hours = 0;
byte minutes = 0;
byte seconds = 0;
boolean ledblink = 0; 
byte status = START;
int blink_counter = 0;

volatile unsigned int sw = 1;

unsigned char i = 0, j = 0;
byte eeptemp=0;
boolean eep1bit=0;
unsigned long ledwait =0;

//Timer1
void initTimerCounter1(void);

void setup() {
  //EEPROM initiarize
  //00:hour,01:minute,02:secondに割り当て
  //00がFFなら、出荷時かMAX値と判断して、3byte00に初期化
  if ( EEPROM.read(EEPADD) == 0xFF) 
    initial_flag = 1;
      else initial_flag = 0;  
  if (initial_flag)  {
     for (i=EEPADD ; i<EEPADD+3 ; i++) {
       EEPROM.write(i,0x00);
     }
  }  

  // Pin initiarize
  pinMode(SW, INPUT);
  digitalWrite(SW,HIGH);
  pinMode(LED, OUTPUT);
  digitalWrite(LED,HIGH);

   //timer1
  initTimerCounter1(); 

  //Sleep initiarize
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();

  delay(500);
  attachInterrupt(0, wakeup,  LOW);  //割り込み開始
  sleep_mode(); //sleepに移行
}


//Timer1設定
void initTimerCounter1(void)
{
    TCCR1 = 0;                  //stop the timer
    TCNT1 = 0;                  //zero the timer
    GTCCR = _BV(PSR1);          //reset the prescaler
    OCR1A = 243;                //set the compare value 1sec
    TIMSK &= ~0x40;  
    TCCR1 = _BV(CTC1) | _BV(CS13) | _BV(CS12); 
}

//LED極性反転
ISR(TIMER1_COMPA_vect)
{
      ledblink = ~ledblink;
      digitalWrite(LED,ledblink);     
}

//LED消灯
void off()
{
  digitalWrite(LED,HIGH);
}

//外部割込みピンに繋がったタクトスイッチでsleepから復帰)
void wakeup(){
}

//swが押されている期間をカウント
void switched(){ 
  for(i=0;i<BUTTON_COUNT;i++){
    sw = digitalRead(SW);
    if (sw ==0) swcount++;
      else swcount =0;
  }
}

//EEPROMの内容をLED点滅で表示
void bin_display()  {
  for(i=0;i<3;i++){
    eeptemp = EEPROM.read(i);
     for(j=0;j<8;j++){
      eep1bit = bitRead(eeptemp, 7-j) ;
      if (eep1bit) ledwait = 1000; else ledwait = 300;
      digitalWrite(LED,LOW);
      delay(ledwait);
      digitalWrite(LED,HIGH);
      delay(1000);
      }
    delay(2000);
  }
}


void loop() {
  delay(LOOP_WAIT); 
  // check SW and avoid chatterin  
  switched();

  if(swcount >= BUTTON_LONGWAIT){
    TIMSK &= ~0x40; 
    bin_display();
    off();  
    swcount = 0;
	}

  if(swcount >= BUTTON_WAIT){

    switch(status){
      
    case START:
      //割り込み停止
      detachInterrupt(0);  
      now1 = millis();
      hours = EEPROM.read(EEPADD);
      minutes = EEPROM.read(EEPADD+1);
      seconds = EEPROM.read(EEPADD+2);
      delay(10); 
      wastetime = hours * 3600 + minutes*60 + seconds;
      //割り込み再開
      attachInterrupt(0, wakeup,  LOW);
       //Timer1 active
      TIMSK |= 0x40; 
      delay(100);
      status = STOP;
      break;
      
    case STOP:
      detachInterrupt(0);
      off();
      TIMSK &= ~0x40; //Timer1 nonactive
      now2 = millis();  
      newtime = wastetime + (now2 - now1)/1000;
      //秒を時、分、秒に変換
      hours = newtime / 3600;
      minutes = (newtime - (hours * 3600) ) / 60;
      seconds = newtime - ( hours * 3600 ) -( minutes *60 );
      //EEPROM WRITE
      EEPROM.write(EEPADD,hours);
      EEPROM.write(EEPADD+1,minutes);
      EEPROM.write(EEPADD+2,seconds);   
      attachInterrupt(0, wakeup,  LOW);
      delay(100); 
      
      status = START;
      sleep_mode();
      break;

      }

  }

}