lnwshop logo
เจ้าของร้านค้านี้ ไม่ได้เข้าสู่ระบบเป็นระยะเวลา 16 วัน แล้ว
  • ตอบกระทู้
  • ตั้งกระทู้ใหม่
QUOTE 

ทดสอบ ROBOT Full เพื่อจำลองการทำงาน For NOD MCU ESP8266 (ลง library ก่อนนะครับ)

เจ้าของร้าน

//********Include libraries*********************************************

#include <IRremoteESP8266.h>

#include <SoftwareSerial.h>

#include <Servo.h>

#include <Wire.h>

#include <LiquidCrystal_PCF8574.h>

#include <Adafruit_MCP23008.h>

 

//Pin assignments and global variables per function. Customize if needed

//*******Pin assignments Motor board and IR receiver********************

const int MotorLeft1 = 2; // MCP23008 PIN 2

const int MotorLeft2 = 3;  // MCP23008 PIN 3

const int MotorRight1 = 0;  // MCP23008 PIN 0

const int MotorRight2 = 1;  // MCP23008 PIN 1

const int MotorLeftPWM = 4; // Nodemcu pin D2 = GPIO 4

const int MotorRightPWM = 5; // Nodemcu pin D1 = GPIO 5

const int irReceiverPin = 13; // Nodemcu pin D7 = GPIO 13

const int servoPin = 15; // Nodemcu pin D8 = GPIO 15

int iSpeed = 700; //speed, range 70% from 0 - 1024

#define LINETHRESHOLD 400

Adafruit_MCP23008 mcp;

//******Infrared key bindings********************************************

const long IRfront = 0xFF629D;      //go straight: button ^

const long IRback = 0xFFA857;       //go back    : button v

const long IRturnright = 0xFFC23D;  //turn right : button >

const long IRturnleft = 0xFF22DD;   //turn left  : button <

const long IRstop = 0xFF02FD;       //stop       : button ok

const long IRcny70 = 0xFF6897;      //CNY70 automatic mode: button 1

const long IRAutorun = 0xFF9867;    //Ultrasonic mode : button 2

const long IRLCD = 0xFFB04F;    //Ultrasonic mode : button 3

//******Track following pin assignments and signals**********************

const int pin_In_Mux = A0; // Nodemcu pin ADC 0 = GPIO A0

const int pin_Out_S0 = 7; // MCP23008 PIN 7

const int pin_Out_S1 = 6; // MCP23008 PIN 6

const int pin_Out_S2 = 5; // MCP23008 PIN 5

int s0 = 0;

int s1 = 0;

int s2 = 0;

int sensor [] = {0, 0, 0}; // keep sensor value

IRrecv irrecv(irReceiverPin);  // IRrecv signal

decode_results infrared;       // decode result

//*******Ultrasonic pin assignments and signals**************************

const int echoPin = 0; // ultrasonic receive = echo pin ,Nodemcu pin D3 = GPIO 0

const int triggerPin = 2; // ultrasonic send = trigger pin ,Nodemcu pin D4 = GPIO 2

Servo myservo; // define myservo

const int degreesForward = 90; //nr degrees to look forward

const int degreesLeft = 180; //nr degrees to look left

const int degreesRight = 0; //nr degrees to look right

const int delay_time = 250; // servo motor delay

const int Fgo = 8; // go straight

const int Rgo = 6; // turn right

const int Lgo = 4; // turn left

const int Bgo = 2; // go back

 

//*****Bluetooth signals**************************************************

//#define BT_SERIAL_RX    11 //Rx pin

//#define BT_SERIAL_TX    10 //Tx pin

//SoftwareSerial btSerial(BT_SERIAL_RX, BT_SERIAL_TX);// RX, TX

//char val; //stores received character. Needs to be global to perform continuous movement

 

//****************** lcd show *******************************************

LiquidCrystal_PCF8574 lcd(0x27);

char str[17] = {"Let 's Get it on"}; // 16 charecter

int i, j;

//*********General SETUP: activate pins***********************************

void setup()

{

  Wire.begin(12, 14); // i2c enable

  //start receiving serial infor

  //btSerial.begin(38400);

  //motor connections

  mcp.begin();  // mcp 28003 enable

  mcp.pinMode(MotorRight1, OUTPUT);  //

  mcp.pinMode(MotorRight2, OUTPUT);  //

  mcp.pinMode(MotorLeft1,  OUTPUT);  //

  mcp.pinMode(MotorLeft2,  OUTPUT);  //

  pinMode(MotorRightPWM, OUTPUT); //enable for right side motor

  pinMode(MotorLeftPWM, OUTPUT); //enable for right side motor

  irrecv.enableIRIn();      // start infrared decode

  myservo.write(degreesForward);       // will make head look in front

 

  //black track following

  mcp.pinMode(pin_Out_S0, OUTPUT);

  mcp.pinMode(pin_Out_S1, OUTPUT);

  mcp.pinMode(pin_Out_S2, OUTPUT);

  pinMode(pin_In_Mux, INPUT);

 

  //Ultra sonic

  pinMode(echoPin, INPUT);

  pinMode(triggerPin, OUTPUT);

  myservo.attach(servoPin);

 

  // lcd i2c

  lcd.begin(16, 2);

  lcd.setBacklight(0);

  display_Lcd();

}

 

//**************Movement functions******************************

void advance(int d) { //go straight

  mcp.digitalWrite(MotorRight1, HIGH);

  mcp.digitalWrite(MotorRight2, LOW);

  mcp.digitalWrite(MotorLeft1, LOW);

  mcp.digitalWrite(MotorLeft2, HIGH);

  analogWrite(MotorRightPWM, iSpeed);

  analogWrite(MotorLeftPWM, iSpeed);

  delay(d * 10);

}

void right(int d) { //turn right (single wheel)

  mcp.digitalWrite(MotorLeft1, LOW);

  mcp.digitalWrite(MotorLeft2, HIGH);

  mcp.digitalWrite(MotorRight1, LOW);

  mcp.digitalWrite(MotorRight2, LOW);

  analogWrite(MotorRightPWM, iSpeed);

  analogWrite(MotorLeftPWM, iSpeed);

  delay(d * 10);

}

void left(int d) {//turn left(single wheel)

  mcp.digitalWrite(MotorRight1, HIGH);

  mcp.digitalWrite(MotorRight2, LOW);

  mcp.digitalWrite(MotorLeft1, LOW);

  mcp.digitalWrite(MotorLeft2, LOW);

  analogWrite(MotorRightPWM, iSpeed);

  analogWrite(MotorLeftPWM, iSpeed);

  delay(d * 10);

}

void turnR(int d) {//turn right (two wheels)

  mcp.digitalWrite(MotorRight1, LOW);

  mcp.digitalWrite(MotorRight2, HIGH);

  mcp.digitalWrite(MotorLeft1, LOW);

  mcp.digitalWrite(MotorLeft2, HIGH);

  analogWrite(MotorRightPWM, iSpeed);

  analogWrite(MotorLeftPWM, iSpeed);

  delay(d * 10);

}

void turnL(int d) {//turn left (two wheels)

  mcp.digitalWrite(MotorRight1, HIGH);

  mcp.digitalWrite(MotorRight2, LOW);

  mcp.digitalWrite(MotorLeft1, HIGH);

  mcp.digitalWrite(MotorLeft2, LOW);

  analogWrite(MotorRightPWM, iSpeed);

  analogWrite(MotorLeftPWM, iSpeed);

  delay(d * 10);

}

void stopp(int d) { //stop

  mcp.digitalWrite(MotorRight1, LOW);

  mcp.digitalWrite(MotorRight2, LOW);

  mcp.digitalWrite(MotorLeft1, LOW);

  mcp.digitalWrite(MotorLeft2, LOW);

  analogWrite(MotorRightPWM, iSpeed);

  analogWrite(MotorLeftPWM, iSpeed);

  delay(d * 10);

}

void back(int d) { //go back

  mcp.digitalWrite(MotorRight1, LOW);

  mcp.digitalWrite(MotorRight2, HIGH);

  mcp.digitalWrite(MotorLeft1, HIGH);

  mcp.digitalWrite(MotorLeft2, LOW);

  analogWrite(MotorRightPWM, iSpeed);

  analogWrite(MotorLeftPWM, iSpeed);

  delay(d * 10);

}

 

//************************* for line follower **********************************

void Advance()

{ //go straight

  mcp.digitalWrite(MotorRight1, HIGH);

  mcp.digitalWrite(MotorRight2, LOW);

  mcp.digitalWrite(MotorLeft1, LOW);

  mcp.digitalWrite(MotorLeft2, HIGH);

  analogWrite(MotorRightPWM, iSpeed - 110); // mas

  analogWrite(MotorLeftPWM, iSpeed - 110);

}

 

void TurnR()

{ //turn right (two wheels)

  mcp.digitalWrite(MotorRight1, LOW);

  mcp.digitalWrite(MotorRight2, HIGH);

  mcp.digitalWrite(MotorLeft1, LOW);

  mcp.digitalWrite(MotorLeft2, HIGH);

  analogWrite(MotorRightPWM, iSpeed - 100);

  analogWrite(MotorLeftPWM, iSpeed - 100);

}

 

void TurnL()

{ //turn left (two wheels)

  mcp.digitalWrite(MotorRight1, HIGH);

  mcp.digitalWrite(MotorRight2, LOW);

  mcp.digitalWrite(MotorLeft1, HIGH);

  mcp.digitalWrite(MotorLeft2, LOW);

  analogWrite(MotorRightPWM, iSpeed - 100);

  analogWrite(MotorLeftPWM, iSpeed - 100);

}

 

//************Ultrasonic distance calculator*************************************

//detect distance for given angles and print char + direction

float getDistance(int degrees, char dir)

{

  myservo.write(degrees);

  digitalWrite(triggerPin, LOW); // ultrasonic echo low level in 2us

  delayMicroseconds(2);

  digitalWrite(triggerPin, HIGH); // ultrasonic echo high level in 10us, at least 10us

  delayMicroseconds(10);

  digitalWrite(triggerPin, LOW); // ultgrasonic echo low level

  float distance = pulseIn(echoPin, HIGH); // read time

  distance = distance / 58 ; // turn time to distance

  Serial.print(dir); //

  Serial.print(" distance: "); //

  Serial.print(int(distance)); //  output distance (mm)

  Serial.print("\n");

  return distance;

}

//*************Ultrasonic direction decision making******************************

//measurements three angles (front, left, right

int getDirectionFromdetection()

{

  int Fspeedd = 0; // front distance

  int Rspeedd = 0; // right distance

  int Lspeedd = 0; // left distance

  int delay_time = 250; //

  int directionn = 0;

 

  //get front distance

  Fspeedd = getDistance(degreesForward, 'F');

 

  // if distance is less than 10mm 4

  if (Fspeedd < 10)

  {

    stopp(1); //  clear output

    directionn = Bgo;

  }

  // if distance less than 25 mm 5

  else if (Fspeedd < 25)

  {

    stopp(1); // clear output

    Lspeedd = getDistance(degreesLeft, 'L'); // detection distance on left side

    delay(delay_time); // waiting for the servo motor to become stable

 

    Rspeedd = getDistance(degreesRight, 'R'); // detection distance on right side

    delay(delay_time); // waiting for servo motor to be stable

 

    // if left distance greater than right

    if (Lspeedd > Rspeedd)

    {

      directionn = Lgo; // go left

    }

 

    if (Lspeedd < Rspeedd)

    { //if left distance less than right

      directionn = Rgo; //go right

    }

 

    if (Lspeedd < 10 && Rspeedd < 10)

    { //if distance less 10mm both right and left 4

      directionn = Bgo; //go back

    }

  }

  else

  {

    directionn = Fgo; //go straight

  }

  return directionn;

}

 

void autoRunUsingUltraSonic()

{

  bool stopPressed;

  int directionn = 0; // front=8, back=2, left=4, right=6

  while (IRAutorun)

  {

    myservo.write(90); // make the servo motor reset

    directionn = getDirectionFromdetection();

    stopPressed = stopCommandPressed();

    if (stopPressed)

    {

      break;

    }

    else if (directionn == Fgo)

    { //go straight

      infrared.value = 0;

      advance(1); //

      Serial.print(" Advance "); //

      Serial.print(" ");

    }

    else if (directionn == Bgo)

    { //go back

      infrared.value = 0;

      back(50); //

      delay(300);

      turnR(100); //

      Serial.print(" Reverse "); //

    }

    else if (directionn == Rgo)

    { //turn right

      infrared.value = 0;

      delay(300);

      back(50);

      delay(300);

      turnR(50); //

      Serial.print(" Right "); //

    }

    else if (directionn == Lgo)

    { //turn left

      infrared.value = 0;

      delay(300);

      back(50);

      delay(300);

      turnL(50);

      Serial.print(" Left ");

    }

  }

  infrared.value = 0;

}

 

//*************************Bluetooth functionality***********************

//Bluetooth commands

//void bluetoothCommand()

//{

//  if (btSerial.available())

//  {

//    val = btSerial.read();

//    btSerial.write(val);

//  }

//  if (val == '2')

//  { // Forward

//    advance(10);

//  }

//  else if (val == '5')

//  { // Stop Forward

//    stopp(10) ;

//    val = btSerial.read(); //read value again, otherwise can't continu with infrared

//  }

//  else if (val == '8')

//  { // Backwards

//    back(10);

//  }

//  else if (val == '6')

//  { // Right

//    turnL(10);

//  }

//  else if (val == '4')

//  { // Left

//    turnR(10);

//  }

//  else if (val == 's')

//  { // Stop, not used though

//    stopp(10 ) ;

//  }

//}

 

//Check if stop command on remote is pressed (button 5)

bool stopCommandPressed() {

  bool stopPressed = false;

  if (irrecv.decode(&infrared))

  {

    irrecv.resume();

    Serial.println(infrared.value, HEX);

    if (infrared.value == IRstop)

    {

      stopp(10);

      stopPressed = true;

    }

  }

  return stopPressed;

}

 

void read_sensor_values()

{

  for (int count = 0; count <= 2; count++)

  {

    s0 = bitRead(count, 0);

    s1 = bitRead(count, 1);

    s2 = bitRead(count, 2);

 

    mcp.digitalWrite(pin_Out_S0, s0);

    mcp.digitalWrite(pin_Out_S1, s1);

    mcp.digitalWrite(pin_Out_S2, s2);

 

    sensor[count] = analogRead(pin_In_Mux);

    delay(10);

  }

}

 

void followBlackLine()

{

  bool stopPressed;

  int SL;  //sensor left

  int SM;  //sensor middle

  int SR;  //sensor right

  while (IRcny70)

  {

    read_sensor_values();

    SL = sensor[2];

    SM = sensor[1];

    SR = sensor[0];

 

    if ((SL > LINETHRESHOLD) && (SM < LINETHRESHOLD) && (SR < LINETHRESHOLD) )

    {

      TurnL();

    }

    else if ((SL < LINETHRESHOLD) && (SM < LINETHRESHOLD) && (SR > LINETHRESHOLD) )

    {

      TurnR();

    }

    else if ((SL > LINETHRESHOLD) && (SM > LINETHRESHOLD) && (SR < LINETHRESHOLD) )

    {

      TurnL();

    }

    else if ((SL < LINETHRESHOLD) && (SM > LINETHRESHOLD) && (SR > LINETHRESHOLD) )

    {

      TurnR();

    }

    else

    {

      Advance();

    }

    stopPressed = stopCommandPressed();

    if (stopPressed)

    {

      break;

    }

  }

  infrared.value = 0;

}

 

//*************************** lcd Function *****************************

 

void display_Lcd()

{

  lcd.setBacklight(255);

  lcd.setCursor(0, 0);

  lcd.print("  ARE U READY?  "); // 16 charecter

 

  for (j = 0; j <= 1; j++)

    for (i = 17; i >= 0; i--)

    {

      switch (j)

      {

        case 0: lcd.noDisplay();  delay(150);

          lcd.display();    delay(150);

 

        case 1: lcd.setCursor(i, 1);

          lcd.print(str[i]);

          delay(100);

          break;

      }

    }

  delay(500);

  lcd.clear();

  lcd.setBacklight(0);

}

//**************************************MAIN LOOP***************************************

void loop()

{

  //bluetooth commands

  // bluetoothCommand();

 

  //************************************normal remote control mode ********

  // decoding success 'receive infrared signal

  if (irrecv.decode(&infrared))

  {

    if (infrared.value == IRfront)

    {

      advance(10); //go straigt

    }

    else if (infrared.value ==  IRback)

    {

      back(10); //go back

    }

    else if (infrared.value == IRturnright)

    {

      turnR(10); // go right

    }

    else if (infrared.value == IRturnleft)

    {

      turnL(10); // go left

    }

    else if (infrared.value == IRstop)

    { //stop

      stopp(10);

    }

    //********************follow black line********cny70 automatic mode********

    else if (infrared.value == IRcny70)

    {

      followBlackLine();

    }

    //***********************ultrasonic automatic mode***************************

    else if (infrared.value == IRAutorun )

    {

      autoRunUsingUltraSonic();

      myservo.write(degreesForward);       // will make head look in front

    }

    //********************wait a little before continuing**************************

    irrecv.resume();

    delay(300);

  }

  else

  {

    stopp(0);

  }

}

1
แสดงความคิดเห็นที่ 0-0 จากทั้งหมด 0 ความคิดเห็น
ข้อความ
ชื่อผู้โพส
ข้อมูลสำหรับการติดต่อกลับ (ไม่เปิดเผย เห็นเฉพาะเจ้าของร้าน)
อีเมล
เบอร์มือถือ
  • ตอบกระทู้

<



    ติดต่อเรา สะดวก    รวดเร็ว ไว้ใจได้

 091-109-7711


  ติดต่อเราผ่านช่องทาง LINE

  ID : king5k

MEMBER

เข้าสู่ระบบด้วย
เข้าสู่ระบบ
สมัครสมาชิก

ยังไม่มีบัญชีเทพ สร้างบัญชีใหม่ ไม่เกิน 5 นาที
สมัครสมาชิก (ฟรี)

STATISTICS

หน้าที่เข้าชม6,457 ครั้ง
ผู้ชมทั้งหมด3,243 ครั้ง
เปิดร้าน21 ก.ย. 2559
ร้านค้าอัพเดท5 ก.ค. 2561
ตะกร้าของฉัน (0)
มีสินค้าทั้งหมด 0 ชนิด 0 ชิ้น
0 บาทราคาสินค้าทั้งหมด
(ยังไม่รวมค่าจัดส่ง)
สั่งซื้อสินค้า
ตะกร้า
( 0 )
รายการสั่งซื้อของฉัน
เข้าสู่ระบบด้วย
เข้าสู่ระบบ
สมัครสมาชิก

ยังไม่มีบัญชีเทพ สร้างบัญชีใหม่ ไม่เกิน 5 นาที
สมัครสมาชิก (ฟรี)
รายการสั่งซื้อของฉัน
ข้อมูลร้านค้านี้
ร้านPiapples
Piapples
วิสัยทัศน์ของเราคือ สร้างชุดฝึกสำหรับการโปรแกรมคอมพิวเตอร์ มอบให้ระบบการศึกษาทั่วประเทศ ยินดีให้คำปรึกษา R&D งานระบบไมโครคอนโทรลเลอร์ งานโปรเจค งานออกแบบดีไซด์
เบอร์โทร : 0911097711
อีเมล : kittisak.krua@gmail.com
ส่งข้อความติดต่อร้าน
เกี่ยวกับร้านค้านี้
สินค้าที่ดูล่าสุด
ดูสินค้าทั้งหมดในร้าน
สินค้าที่ดูล่าสุด
บันทึกเป็นร้านโปรด
Join (สมัครสมาชิกร้าน)
แชร์หน้านี้
แชร์หน้านี้

TOP เลื่อนขึ้นบนสุด
Go to Top
พูดคุย-สอบถาม คลิก