วันอาทิตย์ที่ 30 กรกฎาคม พ.ศ. 2560

Ambulance light by L298 + Arduino + MIT app

 

attention polarity Anode ,Cathode swap may not work 

Led ต้องพิจารณาขั้ว แอโนด แคโทดด้วยนะครับ สลับจะไม่ติด


L298 motor control board


Left motor B Middle external power supply range for motor specification  Right Motor A


ซ้าย คือ มอเตอร์ B ตรงคือ จ่ายไฟจากภายนอกให้ มอเตอร์ ขวาคือมอเตอร์ A







HC06 Bluetooth module







Wiring 






Bluetooth to Arduino wiring




SoftwareSerial mySerial(10,11); // TX, RX

















L298 motor control board connect to Arduino
ENA=>2;
IN1=>3;
IN2=>4;
IN3=>5;
IN4=>6;
ENB=>7;



CODE









#include<SoftwareSerial.h>

char receivedChar;

int ENA=2;
int IN1=3;
int IN2=4;
int IN3=5;
int IN4=6;
int ENB=7;

int timer = 50;           // The higher the number, the slower the timing.
int ledPins[] = {
 IN1,IN2,IN3,IN4
};       // an array of pin numbers to which LEDs are attached
int pinCount = 4;           // the number of pins (i.e. the length of the array)



SoftwareSerial mySerial(10,11); // TX, RX



//RX on Bluetooth to TCX on Arduino through a voltage divider 50ohm from arduino and 100ohm to ground. This is so we can drop the the voltage down to 3.3v (roughly)

// Use blueterm on android to get messages



void setup()

{


 pinMode(ENA,OUTPUT);//output
 pinMode(ENB,OUTPUT);
 pinMode(IN1,OUTPUT);
 pinMode(IN2,OUTPUT);
 pinMode(IN3,OUTPUT);
 pinMode(IN4,OUTPUT);

  mySerial.begin(9600);


  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    pinMode(ledPins[thisPin], OUTPUT);
  }
}



void loop() // run over and over



{




  while (!mySerial.available());   // stay here so long as COM port is empty

  receivedChar = mySerial.read();
 
  switch(receivedChar)
  {
            case 'A':
            digitalWrite(ENA,HIGH);
            digitalWrite(ENB,HIGH);// High is start driving car
         
 
       
 for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(50);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);

  }

  // loop from the highest pin to the lowest:
  for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(50);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
  }


for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(20);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);

  }
step1:
  // loop from the highest pin to the lowest:
  for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(100);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
  }

  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(10);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);

  }

  // loop from the highest pin to the lowest:
  for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(10);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
  }



  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(200);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);

  }

  // loop from the highest pin to the lowest:
  for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(200);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);


    goto step1;
  }


         


  break;
  default:

            digitalWrite(ENA,HIGH);
            digitalWrite(ENB,HIGH);// High is start driving car
         
            digitalWrite(IN1,LOW);
            digitalWrite(IN2,LOW);
            digitalWrite(IN3,LOW);
            digitalWrite(IN4,LOW);

  }

}

วันเสาร์ที่ 22 กรกฎาคม พ.ศ. 2560

Mobile app control Robot via App inventor+HC06 Bluetooth+Arduino









Bluetooth Module HC06

https://www.olimex.com/Products/Components/RF/BLUETOOTH-SERIAL-HC-06/resources/hc06.pdf





Wiring




HC06 to Arduino

RX ---> 11
TX ---> 10







Motor Wiring


Arduino to Wheel motor
2 ---> ENA
3 ---> IN1
4 ---> IN2
5 ---> IN3
6 ---> IN4
7 ---> ENB

Arduino to Arm motor
A0 ---> ENA
A1 ---> IN1
A2 ---> IN2
A3 ---> IN3
A4 ---> IN4
A5 ---> ENB





MIT Inventor App build 


Code

#include<SoftwareSerial.h>

char receivedChar;

int ENA=2;
int IN1=3;
int IN2=4;
int IN3=5;
int IN4=6;
int ENB=7;

int ENA1=A0;
int IN11=A1;
int IN12=A2;
int IN13=A3;
int IN14=A4;
int ENB1=A5;


SoftwareSerial mySerial(10, 11); // RX, TX



//RX on Bluetooth to TCX on Arduino through a voltage divider 50ohm from arduino and 100ohm to ground. This is so we can drop the the voltage down to 3.3v (roughly)

// Use blueterm on android to get messages



void setup()



 pinMode(ENA,OUTPUT);//output
 pinMode(ENB,OUTPUT);
 pinMode(IN1,OUTPUT);
 pinMode(IN2,OUTPUT);
 pinMode(IN3,OUTPUT);
 pinMode(IN4,OUTPUT);

 pinMode(ENA1,OUTPUT);//output
 pinMode(ENB1,OUTPUT);
 pinMode(IN11,OUTPUT);
 pinMode(IN12,OUTPUT);
 pinMode(IN13,OUTPUT);
 pinMode(IN14,OUTPUT);
  
  mySerial.begin(9600); 
}



void loop() // run over and over



{

  


  while (!mySerial.available());   // stay here so long as COM port is empty

  receivedChar = mySerial.read();

  if (receivedChar == 'A') {

            //digitalWrite(ENA,LOW);
            // digitalWrite(ENB,LOW);// High is start driving car
              
             digitalWrite(ENA,HIGH);
             digitalWrite(ENB,HIGH);// High is start driving car
  
             digitalWrite(IN1,LOW); 
             digitalWrite(IN2,HIGH);//setting motorA's directon
             digitalWrite(IN3,LOW);
             digitalWrite(IN4,HIGH);//setting motorB's directon
  }
              
  if (receivedChar == 'B') {

             // digitalWrite(ENA,LOW);
             // digitalWrite(ENB,LOW);// High is start driving car
              
              
                    
             digitalWrite(ENA,HIGH);
             digitalWrite(ENB,HIGH);// High is start driving car
  
             digitalWrite(IN1,HIGH); 
             digitalWrite(IN2,LOW);//setting motorA's directon
             digitalWrite(IN3,HIGH);
             digitalWrite(IN4,LOW);//setting motorB's directon

                         
  }      
  if (receivedChar == 'C') 
  
              {

             // digitalWrite(ENA,LOW);
             // digitalWrite(ENB,LOW);// High is start driving car
  
             digitalWrite(ENA,HIGH);
             digitalWrite(ENB,HIGH);// High is start driving car
  
             digitalWrite(IN1,HIGH); 
             digitalWrite(IN2,LOW);//setting motorA's directon
             digitalWrite(IN3,LOW);
             digitalWrite(IN4,LOW);//setting motorB's directon

             

  } // if it is a 3 flash the LED

  if (receivedChar == 'D') {
  
              //digitalWrite(ENA,LOW);
              //digitalWrite(ENB,LOW);// High is start driving car
              
                          
             digitalWrite(ENA,HIGH);
             digitalWrite(ENB,HIGH);// High is start driving car
  
             digitalWrite(IN1,LOW); 
             digitalWrite(IN2,LOW);//setting motorA's directon
             digitalWrite(IN3,HIGH);
             digitalWrite(IN4,LOW);//setting motorB's directon


  } // if it is a 4 print out lots of sensor data


  if (receivedChar == 'E') {
  
             digitalWrite(ENA,HIGH);
             digitalWrite(ENB,HIGH);// High is start driving car
  
             digitalWrite(IN1,LOW); 
             digitalWrite(IN2,LOW);//setting motorA's directon
             digitalWrite(IN3,LOW);
             digitalWrite(IN4,LOW);//setting motorB's directon
  
  }
  
}




วันพุธที่ 19 กรกฎาคม พ.ศ. 2560

Modify toy wire control to be wireless control by Arduino + PS2 wireless control EP 2/2 , Hardware all





Moving motor and Arm motor





L298 board control motor




 Arduino Micro controller






PS2X Receiver and Transmitter 









L298 Board control motor




Wiring

Example Moving motor
Complete wiring 


Arduino to Wheel motor
2 ---> ENA
3 ---> IN1
4 ---> IN2
5 ---> IN3
6 ---> IN4
7 ---> ENB

Arduino to Arm motor
A0 ---> ENA
A1 ---> IN1
A2 ---> IN2
A3 ---> IN3
A4 ---> IN4
A5 ---> ENB

Commissioning






VIDEO




CODE

#include <PS2X_lib.h>



PS2X ps2x; // create PS2 Controller Class


//right now, the library does NOT support hot pluggable controllers, meaning

//you must always either restart your Arduino after you conect the controller,

//or call config_gamepad(pins) again after connecting the controller.

int error = 0;

byte type = 0;

byte vibrate = 0;
int ENA=2;
int IN1=3;
int IN2=4;
int IN3=5;
int IN4=6;
int ENB=7;

int ENA1=A0;
int IN11=A1;
int IN12=A2;
int IN13=A3;
int IN14=A4;
int ENB1=A5;


void setup() {
  // put your setup code here, to run once:


 pinMode(ENA,OUTPUT);//output
 pinMode(ENB,OUTPUT);
 pinMode(IN1,OUTPUT);
 pinMode(IN2,OUTPUT);
 pinMode(IN3,OUTPUT);
 pinMode(IN4,OUTPUT);

 pinMode(ENA1,OUTPUT);//output
 pinMode(ENB1,OUTPUT);
 pinMode(IN11,OUTPUT);
 pinMode(IN12,OUTPUT);
 pinMode(IN13,OUTPUT);
 pinMode(IN14,OUTPUT);

Serial.begin(57600);

 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************

 error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error

 if(error == 0){

   Serial.println("Found Controller, configured successful");

   Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");

  Serial.println("holding L1 or R1 will print out the analog stick values.");

  Serial.println("Go to www.billporter.info for updates and to report bugs.");

 }

  else if(error == 1)

   Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");

  else if(error == 2)

   Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");

  else if(error == 3)

   Serial.println("Controller refusing to enter Pressures mode, may not support it. ");

   //Serial.print(ps2x.Analog(1), HEX);

   type = ps2x.readType();

     switch(type) {

       case 0:

        Serial.println("Unknown Controller type");

       break;

       case 1:

        Serial.println("DualShock Controller Found");

       break;

       case 2:

         Serial.println("GuitarHero Controller Found");

       break;

     }

}



void loop() {
  // put your main code here, to run repeatedly:
           digitalWrite(ENA,HIGH);
           digitalWrite(ENB,HIGH);// High is start driving car
  //forward
           digitalWrite(IN1,LOW); 
           digitalWrite(IN2,LOW);//setting motorA's directon
           digitalWrite(IN3,LOW);
           digitalWrite(IN4,LOW);//setting motorB's directon]


          // digitalWrite(ENA1,HIGH);
          // digitalWrite(ENB1,HIGH);// High is start driving car
  //forward
          // digitalWrite(IN11,LOW); 
          // digitalWrite(IN12,LOW);//setting motorA's directon
          // digitalWrite(IN13,LOW);
          // digitalWrite(IN14,LOW);//setting motorB's directon]


           if(error == 1) //skip loop if no controller found

  return;

 if(type == 2){ //Guitar Hero Controller

   ps2x.read_gamepad();          //read controller

   if(ps2x.ButtonPressed(GREEN_FRET))

     Serial.println("Green Fret Pressed");

   if(ps2x.ButtonPressed(RED_FRET))

     Serial.println("Red Fret Pressed");

   if(ps2x.ButtonPressed(YELLOW_FRET))

     Serial.println("Yellow Fret Pressed");

   if(ps2x.ButtonPressed(BLUE_FRET))

     Serial.println("Blue Fret Pressed");

   if(ps2x.ButtonPressed(ORANGE_FRET))

     Serial.println("Orange Fret Pressed");

    if(ps2x.ButtonPressed(STAR_POWER))

     Serial.println("Star Power Command");

    if(ps2x.Button(UP_STRUM))          //will be TRUE as long as button is pressed

     Serial.println("Up Strum");

    if(ps2x.Button(DOWN_STRUM))

     Serial.println("DOWN Strum");

    if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed

         Serial.println("Start is being held");

    if(ps2x.Button(PSB_SELECT))

         Serial.println("Select is being held");

    if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE

    {

        Serial.print("Wammy Bar Position:");

        Serial.println(ps2x.Analog(WHAMMY_BAR), DEC);

    }

 }

 else { //DualShock Controller

    ps2x.read_gamepad(false, vibrate);          //read controller and set large motor to spin at 'vibrate' speed

    if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed

         Serial.println("Start is being held");

    if(ps2x.Button(PSB_SELECT))

         Serial.println("Select is being held");

   

     if(ps2x.Button(PSB_PAD_UP)) {         //will be TRUE as long as button is pressed

       Serial.print("Up held this hard: ");

      Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);

           digitalWrite(ENA,HIGH);
           digitalWrite(ENB,HIGH);// High is start driving car
  //forward
           digitalWrite(IN1,HIGH); 
           digitalWrite(IN2,LOW);//setting motorA's directon
           digitalWrite(IN3,HIGH);
           digitalWrite(IN4,LOW);//setting motorB's directon]

      }

      if(ps2x.Button(PSB_PAD_RIGHT)){

           


       Serial.print("Right held this hard: ");

        Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);

        digitalWrite(ENA,HIGH);
           digitalWrite(ENB,HIGH);// High is start driving car
  //forward
           digitalWrite(IN1,LOW); 
           digitalWrite(IN2,LOW);//setting motorA's directon
           digitalWrite(IN3,HIGH);
           digitalWrite(IN4,LOW);//setting motorB's directon]


          
      }

      if(ps2x.Button(PSB_PAD_LEFT)){

       Serial.print("LEFT held this hard: ");

        Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);

           digitalWrite(ENA,HIGH);
           digitalWrite(ENB,HIGH);// High is start driving car
  //forward
           digitalWrite(IN1,HIGH); 
           digitalWrite(IN2,LOW);//setting motorA's directon
           digitalWrite(IN3,LOW);
           digitalWrite(IN4,LOW);//setting motorB's directon]

      }

      if(ps2x.Button(PSB_PAD_DOWN)){

       Serial.print("DOWN held this hard: ");

     Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);

      digitalWrite(ENA,HIGH);
           digitalWrite(ENB,HIGH);// High is start driving car
  //forward
           digitalWrite(IN1,LOW); 
           digitalWrite(IN2,HIGH);//setting motorA's directon
           digitalWrite(IN3,LOW);
           digitalWrite(IN4,HIGH);//setting motorB's directon]


      } 

      vibrate = ps2x.Analog(PSAB_BLUE);        //this will set the large motor vibrate speed based on

                                              //how hard you press the blue (X) button   

  

    if (ps2x.NewButtonState())               //will be TRUE if any button changes state (on to off, or off to on)

    {

       

        if(ps2x.Button(PSB_L3))

         Serial.println("L3 pressed");

        if(ps2x.Button(PSB_R3))

         Serial.println("R3 pressed");

        if(ps2x.Button(PSB_L2))

         Serial.println("L2 pressed");

        if(ps2x.Button(PSB_R2))

         Serial.println("R2 pressed");

        if(ps2x.Button(PSB_GREEN)){

         Serial.println("Triangle pressed");

         digitalWrite(ENA1,HIGH);
           digitalWrite(ENB1,HIGH);// High is start driving car
  
           digitalWrite(IN11,LOW); 
           digitalWrite(IN12,LOW);//setting motorA's directon
           digitalWrite(IN13,LOW);
           digitalWrite(IN14,LOW);//setting motorB's directon]
        }

    } 



    if(ps2x.ButtonPressed(PSB_RED))        {     //will be TRUE if button was JUST pressed

         Serial.println("Circle just pressed");

           digitalWrite(ENA1,HIGH);
           digitalWrite(ENB1,HIGH);// High is start driving car
  
           digitalWrite(IN11,LOW); 
           digitalWrite(IN12,LOW);//setting motorA's directon
           digitalWrite(IN13,LOW);
           digitalWrite(IN14,LOW);//setting motorB's directon]

         
           digitalWrite(ENA1,HIGH);
           digitalWrite(ENB1,HIGH);// High is start driving car
  //forward
           digitalWrite(IN11,LOW); 
           digitalWrite(IN12,LOW);//setting motorA's directon
           digitalWrite(IN13,LOW);
           digitalWrite(IN14,HIGH);//setting motorB's directon]
           
           
          

    }

    if(ps2x.ButtonReleased(PSB_PINK))    {         //will be TRUE if button was JUST released

         Serial.println("Square just released");

           digitalWrite(ENA1,HIGH);
           digitalWrite(ENB1,HIGH);// High is start driving car
  //forward
           digitalWrite(IN11,LOW); 
           digitalWrite(IN12,LOW);//setting motorA's directon
           digitalWrite(IN13,HIGH);
           digitalWrite(IN14,LOW);//setting motorB's directon]

    }
    if(ps2x.NewButtonState(PSB_BLUE))  {          //will be TRUE if button was JUST pressed OR released

         Serial.println("X just changed");   

           digitalWrite(ENA1,HIGH);
           digitalWrite(ENB1,HIGH);// High is start driving car
  //forward
           digitalWrite(IN11,LOW); 
           digitalWrite(IN12,HIGH);//setting motorA's directon
           digitalWrite(IN13,LOW);
           digitalWrite(IN14,LOW);//setting motorB's directon]





    }


    if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE

    {

        Serial.print("Stick Values:");

        Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX 

        Serial.print(",");

        Serial.print(ps2x.Analog(PSS_LX), DEC);

        Serial.print(",");

        Serial.print(ps2x.Analog(PSS_RY), DEC);

        Serial.print(",");

        Serial.println(ps2x.Analog(PSS_RX), DEC);

    }

 }

 delay(100);
}