總瀏覽量

2012年7月18日 星期三

Clock = Arduino / Motoduino + RTC (DS1307) + SPI LED (7-Segment)

利用RTC module和LED七段顯示器做出一個簡單的時鐘, SPI介面可以省去許多arduino的IO pin.



DIY材料:
1.Arduino
2.RTC (DS1307) module
3.SPI LED module(7-segment)
4.Inteface Shield (option)
5.9V battery

Arduino sketch:

#include <stdio.h>
#include <string.h>
#include <DS1302.h>

//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 3;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 9;
byte Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
byte Dot = 0x7f;
boolean DotOn;
/* Set the appropriate digital I/O pin connections */
uint8_t CE_PIN   = 5;  //RST
uint8_t IO_PIN   = 6;
uint8_t SCLK_PIN = 7;

/* Create buffers */
char buf[50];
char day[10];

/* Create a DS1302 object */
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

void clearAll()
{
  for(int i=0; i<8; i++)
  {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
    digitalWrite(latchPin, HIGH);
    delay(10);
  }
}

void displayTime(byte h1, byte h2, byte m1, byte m2, byte s1, byte s2)
{
  if (DotOn)
  {
  digitalWrite(latchPin, LOW);
  // shift the bits out:
  shiftOut(dataPin, clockPin, MSBFIRST, s2);
  shiftOut(dataPin, clockPin, MSBFIRST, s1);
  shiftOut(dataPin, clockPin, MSBFIRST, Dot);
  shiftOut(dataPin, clockPin, MSBFIRST, m2);
  shiftOut(dataPin, clockPin, MSBFIRST, m1);
  shiftOut(dataPin, clockPin, MSBFIRST, Dot);
  shiftOut(dataPin, clockPin, MSBFIRST, h2);
  shiftOut(dataPin, clockPin, MSBFIRST, h1);
    // turn on the output so the LEDs can light up:
  digitalWrite(latchPin, HIGH);
  DotOn = false;
  }
  else
  {
  digitalWrite(latchPin, LOW);
  // shift the bits out:
  shiftOut(dataPin, clockPin, MSBFIRST, s2);
  shiftOut(dataPin, clockPin, MSBFIRST, s1);
  shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
  shiftOut(dataPin, clockPin, MSBFIRST, m2);
  shiftOut(dataPin, clockPin, MSBFIRST, m1);
  shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
  shiftOut(dataPin, clockPin, MSBFIRST, h2);
  shiftOut(dataPin, clockPin, MSBFIRST, h1);
    // turn on the output so the LEDs can light up:
  digitalWrite(latchPin, HIGH);
   DotOn = true;
  }
}

void print_time()
{
  /* Get the current time and date from the chip */
  Time t = rtc.time();

  /* Name the day of the week */
  memset(day, 0, sizeof(day));  /* clear day buffer */
  int Hour1 = t.hr/10;
  int Hour2 = t.hr%10;
  int min1 = t.min/10;
  int min2 = t.min%10;
  int sec1 = t.sec/10;
  int sec2 = t.sec%10;
 
  byte   h1 = Tab[Hour1];
  byte   h2 = Tab[Hour2];
  byte   m1 = Tab[min1];
  byte   m2 = Tab[min2];
  byte   s1 = Tab[sec1];
  byte   s2 = Tab[sec2];

    displayTime(h1, h2, m1, m2, s1, s2);
}


void setup()
{
  Serial.begin(57600);
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);

  rtc.write_protect(false);
  rtc.halt(false);

  /* Make a new time object to set the date and time */
  Time t(2012, 7, 11, 21, 16, 37, 3);

  /* Set the time and date on the chip */
  rtc.time(t);
    clearAll();
}


/* Loop and print the time every second */
void loop()
{
  print_time();
  delay(1000);
}


Video: http://www.youtube.com/watch?v=RAb9WjOctdU

My Blog:  http://sinocgtchen.blogspot.com
More videos: http://www.youtube.com/user/sinocgtchen
Motoduino information: http://motoduino.com
My Email: sinocgtchen@gmail.com

2012年7月13日 星期五

自動循線車(Line Following Car) = Motoduino (Arduino + L293D) + IR Sensors


之前忘記POST這篇DIY的過程給大家分享,現在利用一點時間說明一下, 這次使用 Motoduino 來做循線車是很容易的一件事, 只要加一個 Tracker Sensor(IR Sensor) 及修改Arduino程式即完成. 

DIY材料:
1.Motoduino 或 (Arduino Duemilanove + Motor shield)
2.Tracker Sensor (IR Sensor)
3.小車本體
4. 9V battery





Sketch(Arduino程式):

// Sensor sequence: SLeftLeft SMiddle SRightRight
const int SLeftLeft = 9;      //左感測器輸入腳
const int SMiddle = 10;     //中間感測器輸入腳
const int SRightRight = 11;     //右感測器輸入腳

// variables will change:
int SLL;    //左感測器狀態
int SM;    //中感測器狀態
int SRR;    //右感測器狀態
const int Motor_M1 = 7;  
const int Motor_M2 = 8;  
const int Motor_E1 = 5;    
const int Motor_E2 = 6;  

byte byteSensorStatus=0;

#define SENSOR_L 4;
#define SENSOR_M 2;
#define SENSOR_R 1;

void setup() {
   //set up serial communications
   Serial.begin(9600);

  // 輸出入接腳初始設定
  pinMode(SLeftLeft, INPUT);
  pinMode(SMiddle, INPUT);
  pinMode(SRightRight, INPUT);
  pinMode(Motor_M1, OUTPUT);
  pinMode(Motor_M2, OUTPUT);
}

void loop(){
  byteSensorStatus = 0;
  // 讀取感測器狀態值
  SLL = digitalRead(SLeftLeft);
  if(SLL == 1)
     byteSensorStatus = (byteSensorStatus | (0x01 << 2));
  SM = digitalRead(SMiddle);
  if(SM == 1)
     byteSensorStatus = (byteSensorStatus | (0x01 << 1));
  SRR = digitalRead(SRightRight);
  if(SRR == 1)
     byteSensorStatus = (byteSensorStatus | 0x01);
//   Serial.println(byteSensorStatus, HEX);
  switch(byteSensorStatus)
  { // 0:
    case 0: // SL:0 SM:0 SR:0
            motorstop(0,0);
            break;
    case 1: // SL:0 SM:0 SR:1
            left(0,0);
            break;
    case 2: // SL:0 SM:1 SR:0
            motorstop(0,0);
            break;
    case 3: // SL:0 SM:1 SR:1
            left(0,0);
            break;
    case 4: // SL:1 SM:0 SR:0
             right(0,0);
             break;
    case 5: // SL:1 SM:0 SR:1
             forward(0,0);
             break;
    case 6: // SL:1 SM:1 SR:0
             right(0,0);
             break;
    case 7: // SL:1 SM:1 SR:1
             forward(0,0);
  }
}

void motorstop(byte flag, byte numOfValues)
{
  digitalWrite( Motor_E1, 0);
  digitalWrite( Motor_E2, 0);
  Serial.println("stop : ");
}

void forward(byte flag, byte numOfValues)
{
  digitalWrite( Motor_M1, HIGH);
  digitalWrite( Motor_M2, HIGH);
  analogWrite( Motor_E1, 255);
  analogWrite( Motor_E2, 255);
}

void back(byte flag, byte numOfValues)
{
  digitalWrite( Motor_M1, LOW);
  digitalWrite( Motor_M2, LOW);
  analogWrite( Motor_E1, 255);
  analogWrite( Motor_E2, 255);
}

void right(byte flag, byte numOfValues)
{
  digitalWrite( Motor_M1, HIGH);
  digitalWrite( Motor_M2, HIGH);
  analogWrite( Motor_E1, 255);
  analogWrite( Motor_E2, 0);
}

void left(byte flag, byte numOfValues)
{
  digitalWrite( Motor_M1, HIGH);
  digitalWrite( Motor_M2, HIGH);
  analogWrite( Motor_E1, 0);
  analogWrite( Motor_E2, 255);
}

--------------------------------------------------------------------------

The video demonstration: http://www.youtube.com/watch?v=NkF-v1hor-U&list=UU6aKpj71jLKYABYLr3Wbpuw&index=2&feature=plcp

Motoduino information: http://motoduino.com
My Email: sinocgtchen@gmail.com