2018年3月5日 星期一

Arduino (26) 主、從端HC-05藍芽互相連通+二輪智能車系統。


智能車搭配藍芽序列阜操控,

如果已經玩到現在這種程度的話就知道只是想充充版面而已,

沒什麼難度,只想試看看而已,順便也寫一下。



搭配一個Master。




因為要同時看螢幕和車子,只好讓他懸空轉。

程式如下 :

就只附上Slave端的就好了。

#include <SoftwareSerial.h>
SoftwareSerial BT(3, 4);
char val;
const byte IN1 = 10;  
const byte IN2 = 9;
const byte IN3 = 8;
const byte IN4 = 7;

void setup() {
  BT.begin(38400);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}
void forward()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
}
//前進的函式。

void backward()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
}
//後退的函式。

void turnLeft()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}
//左轉的函式。

void turnRight()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
}
//右轉的函式。

void stop()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}
//停止的函式。
void loop() {
  if (BT.available()) {
    val = BT.read();
    if (val == '1') {
      forward();
      delay(100);
      BT.println("forward");
    } else if (val == '2') {
      backward();
      delay(100);
      BT.println("backward");
    }else if (val == '3') {
       turnLeft();
       delay(100);
      BT.println("turnLeft");
    }
    else if (val == '4') {
       turnRight(); 
       delay(100);
      BT.println("turnRight");
    }
    else if (val == '5') {
       stop();
       delay(100);
      BT.println("stop");
    }
    //輸入數字對應輪子轉動方式。

    delay(100);
  }
}




2018年3月4日 星期日

Arduino (25) 循跡辨識模組TCRT5000+二輪智能車系統。


智能車專案的第三種系統,辨識黑白線軌道,感應模組就是萬向輪左右那兩根。



循跡辨識模組TCRT5000,上面有一顆LED,觸發才會亮,基本原理是紅外線反射。

安裝位置愈低愈好,我一開始安裝太高反應很遲鈍。




意外的強,還以為這東西會有跟超聲波一樣反應遲鈍的問題。


程式如下:

const int SRight = 2;    
const int SLeft = 3;      
//右、左輪感測器宣告。

const int motorIn1 = 10;
const int motorIn2 = 9;
const int motorIn3 = 8;     
const int motorIn4 = 7;      
char val; 
int SRR;    
int SLL;    
byte byteSensorStatus=0;

void setup() 
{
  pinMode(SLeft, INPUT);
  pinMode(SRight, INPUT);
  pinMode(motorIn1, OUTPUT);
  pinMode(motorIn2, OUTPUT);
  pinMode(motorIn3, OUTPUT);
  pinMode(motorIn4, OUTPUT);  
}


void loop(){
 byteSensorStatus = 0;
  SRR = digitalRead(SRight);
  if(SRR == 1)
     byteSensorStatus = (byteSensorStatus | (0x01 << 1));

  SLL = digitalRead(SLeft);
  if(SLL == 1)
     byteSensorStatus = (byteSensorStatus | 0x01);
   //辨識循跡狀態的公式。

  switch(byteSensorStatus)
  {             
    case 0: 
           motorstop();
            break;
    //0、0(黑、黑,停止)。

    case 1: 
             left();  
            break;
   //1、0(白、黑,左轉)。

    case 2: 
             right(); 
            break;
   //0、1(黑、白,右轉)。

    case 3: 
           forward() ;
            break;
   //1、1(白、白,前進)。

  } 

}

void motorstop()
{
  digitalWrite(motorIn1, LOW);
  digitalWrite(motorIn2, LOW);
  digitalWrite(motorIn3, LOW);
  digitalWrite(motorIn4, LOW);
}

void forward()
{
  digitalWrite(motorIn1, HIGH);
  digitalWrite(motorIn2, LOW);
  digitalWrite(motorIn3, HIGH);
  digitalWrite(motorIn4, LOW);
}

void backward()
{
  digitalWrite(motorIn1, LOW);
  digitalWrite(motorIn2, HIGH);
  digitalWrite(motorIn3, LOW);
  digitalWrite(motorIn4, HIGH);

}

void right()
{
  digitalWrite(motorIn1, LOW);
  digitalWrite(motorIn2, LOW);
  digitalWrite(motorIn3, HIGH);
  digitalWrite(motorIn4, LOW);

}

void left()
{
  digitalWrite(motorIn1, HIGH);
  digitalWrite(motorIn2, LOW);
  digitalWrite(motorIn3, LOW);
  digitalWrite(motorIn4, LOW);
}





2018年3月1日 星期四

Arduino (24) 超聲波模組HC-SR01+二輪智能車系統。


和前一篇的差別就是將紅外線拆除,裝上了超聲波模組HC-SR01,

這看起來挺像瓦力的,兩個眼睛。

模式就是前進後,前方距離只有20CM時停止0.25秒,然後轉向,再前進。





程式如下 :

const int trigPin=11;
const int echoPin=12;
unsigned long data;
const byte IN1 = 10;   
const byte IN2 = 9;
const byte IN3 = 8;  
const byte IN4 = 7;

unsigned long ping(){
  digitalWrite(trigPin,HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin,LOW);
  return pulseIn(echoPin,HIGH);
//超聲波函式。

}
byte dir = 0;
void setup() {
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(trigPin,OUTPUT);
  pinMode(echoPin,INPUT);
  Serial.begin(9600);

}
void forward()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW); 
}
void backward()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);  
}
void turnLeft()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW); 
}
void turnRight()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
}
void stop()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}
void loop() {
   data=ping()/58;
  int A=abs(data);
 //A就是距離,單位公分。

  if (A>20) { 
  if (dir != 0) {  // 如果目前的行進狀態不是「前進」
     dir = 0;        // 設定成「前進」
     stop();         // 暫停馬達0.25秒
     delay(250);
      }
    forward();    // 前進
     } else {
   if (dir != 1) { // 如果目前的狀態不是「右轉」
      dir = 1;       // 設定成「右轉」
      stop();        // 暫停馬達0.25秒
      delay(250); 
      }
     turnRight(); // 向右轉
      }
   //上面這一坨是抄書本的,比較穩定。

   delay(500); 
}



8051 (6) 紅外線避障模組控制LED七段顯示器。

這篇要做的Project就是感測器測到訊號時,LED七段顯示器會開始計算偵測次數, 到第5次時會讓紅色LED燈發光。 程式如下: #include <reg52.h> unsigned char seg[5]={0xf9,...