04mblock+紅外線遙控

在淘寶上發現有很便宜的紅外線遙控器,可以用來遙控「自走車」

http://tw.taobao.com/item/40183417354.htm?fromSite=main&spm=a1z09.2.0.0.9NlHbN&_u=d1lsjr253e31

在國小學生,應該會比用手機寫APP(app inventor)來遙控自走車還要實用

只好按右上方的「用Arduino IDE編輯」

並在程式加上底下「紅色字」的部分

#include <Arduino.h>

#include <Wire.h>

//#include <Servo.h>

#include <SoftwareSerial.h>

#include <IRremote.h>

int RECV_PIN = 11; // 使用數位腳位11接收紅外線訊號

IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入

decode_results results; // 儲存訊號的結構

double angle_rad = PI/180.0;

double angle_deg = 180.0/PI;

void backward();

void left();

void forward();

void right();

void stop();

double ir;

void backward()

{

digitalWrite(7,1);

digitalWrite(8,0);

digitalWrite(9,1);

digitalWrite(10,0);

}

void left()

{

digitalWrite(7,0);

digitalWrite(8,1);

digitalWrite(9,0);

digitalWrite(10,0);

}

void forward()

{

digitalWrite(7,0);

digitalWrite(8,1);

digitalWrite(9,0);

digitalWrite(10,1);

}

void right()

{

digitalWrite(7,0);

digitalWrite(8,0);

digitalWrite(9,0);

digitalWrite(10,1);

}

void stop()

{

digitalWrite(7,0);

digitalWrite(8,0);

digitalWrite(9,0);

digitalWrite(10,0);

}

void setup(){

pinMode(7,OUTPUT);

pinMode(8,OUTPUT);

pinMode(9,OUTPUT);

pinMode(10,OUTPUT);

irrecv.enableIRIn(); // 啟動接收

}

void loop(){

if (irrecv.decode(&results)) {

// Serial.println(results.value, HEX);

ir=results.value;

irrecv.resume(); // Receive the next value

}

delay(100);

if(ir==16736925){

forward();

}

if(ir==16754775){

backward();

}

if(ir==16720605){

left();

}

if(ir==16761405){

right();

}

if(ir==16712445){

stop();

}

}

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

將L298N的ENA接到Arduino 5的接腳(控制右輪速度)(PWM,模擬成類比功能,值介於0~255

將L298N的ENB接到Arduino 6的接腳(控制左輪速度)

利用遙控器的1、4來增加及減少左輪速度

利用遙控器的3、6來增加及減少右輪速度

利用遙控器的2、5來增加及減少雙輪速度

<<mblock檔案如附件>>

#include <Arduino.h>

#include <Wire.h>

//#include <Servo.h>

#include <SoftwareSerial.h>

#include <IRremote.h>

int RECV_PIN = 11; // 使用數位腳位11接收紅外線訊號

IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入

decode_results results; // 儲存訊號的結構

double angle_rad = PI/180.0;

double angle_deg = 180.0/PI;

void backward();

double rpower;

double lpower;

void left();

void forward();

void right();

void stop();

double ir;

void backward()

{

digitalWrite(7,1);

digitalWrite(8,0);

digitalWrite(9,1);

digitalWrite(10,0);

pinMode(5,OUTPUT);

analogWrite(5,rpower);

pinMode(6,OUTPUT);

analogWrite(6,lpower);

}

void left()

{

digitalWrite(7,0);

digitalWrite(8,1);

digitalWrite(9,0);

digitalWrite(10,0);

pinMode(5,OUTPUT);

analogWrite(5,rpower);

pinMode(6,OUTPUT);

analogWrite(6,lpower);

}

void forward()

{

digitalWrite(7,0);

digitalWrite(8,1);

digitalWrite(9,0);

digitalWrite(10,1);

pinMode(5,OUTPUT);

analogWrite(5,rpower);

pinMode(6,OUTPUT);

analogWrite(6,lpower);

}

void right()

{

digitalWrite(7,0);

digitalWrite(8,0);

digitalWrite(9,0);

digitalWrite(10,1);

pinMode(5,OUTPUT);

analogWrite(5,rpower);

pinMode(6,OUTPUT);

analogWrite(6,lpower);

}

void stop()

{

digitalWrite(7,0);

digitalWrite(8,0);

digitalWrite(9,0);

digitalWrite(10,0);

pinMode(5,OUTPUT);

analogWrite(5,0);

pinMode(6,OUTPUT);

analogWrite(6,0);

}

void setup(){

pinMode(7,OUTPUT);

pinMode(8,OUTPUT);

pinMode(9,OUTPUT);

pinMode(10,OUTPUT);

lpower = 200;

rpower = 200;

irrecv.enableIRIn(); // 啟動接收

}

void loop(){

if (irrecv.decode(&results)) {

// Serial.println(results.value, HEX);

ir=results.value;

irrecv.resume(); // Receive the next value

}

delay(100);

if(((ir)==(16736925))){

forward();

}

if(((ir)==(16754775))){

backward();

}

if(((ir)==(16720605))){

left();

}

if(((ir)==(16761405))){

right();

}

if(((ir)==(16712445))){

stop();

}

if(((ir)==(16738455))){

if((lpower) < (255)){

lpower += 5;

}

}

if(((ir)==(16724175))){

if((lpower) > (0)){

lpower += -5;

}

}

if(((ir)==(16756815))){

if((rpower) < (255)){

rpower += 5;

}

}

if(((ir)==(16743045))){

if((rpower) > (0)){

rpower += -5;

}

}

if(((ir)==(16750695))){

if((lpower) < (255)){

lpower += 5;

}

if((rpower) < (255)){

rpower += 5;

}

}

if(((ir)==(16718055))){

if((rpower) > (0)){

lpower += -5;

}

if((rpower) > (0)){

rpower += -5;

}

}

}

=============================================

再上LCD顯示器模組,將左右輪的POWER數值數值顯示出來!!

Library 的程式如附件中的LiquidCrystal_I2C,將此資料夾放到libraries資料夾內

這部分搞了很久,也用arduino 1.06就可以!

將LCD的

  • SCL接在A5

  • SDA接在A4

  • VCC接在5V

  • GND接在GND

紅外線接收器S(圖的紅線)接腳位11、中間線接5V(褐色)、-(黑線)接GND

先透過下面arduino程式,找出遙控器的「各按鍵」相對的編碼

/*

* IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv

* An IR detector/demodulator must be connected to the input RECV_PIN.

* Version 0.1 July, 2009

* Copyright 2009 Ken Shirriff

* http://arcfn.com

*/

#include <IRremote.h>

int RECV_PIN = 11; // 使用數位腳位11接收紅外線訊號

IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入

decode_results results; // 儲存訊號的結構

void setup()

{

Serial.begin(9600);

irrecv.enableIRIn(); // Start the receiver

}

void loop() {

if (irrecv.decode(&results)) { // 接收紅外線訊號並解碼

// Serial.println(results.value, HEX);

Serial.println(results.value); //不採用16進位

irrecv.resume(); // Receive the next value

}

delay(100);

}

上:16736925(FF629D)

下:16754775(FFA857)

左:16720605(FF22DD)

右:16761405(FFC23D)

OK:16712445(FF02FD)

1:16738455(FF6897)

2:16750695(FF9867)

3:16756815(FFB04F)

4:16724175(FF30CF)

5:16718055(FF18E7)

6:16743045(FF7A85)

7:16716015(FF10EF)

8:16726215(FF38C7)

9:16734885(FF5AA5)

0:16730805(FF4AB5)

*:16728765(FF42BD)

#:16732845(FF52AD)

一樣先用mblock寫程式

但發現接在腳位11的紅外線接收器,只能判斷ON(1)沒接收到訊號及OFF(0)有接收到訊號

無法分辦每個按鍵的不同,無法顯示不同編碼

參考:

mblock程式,如下

參考本網站另一篇文章「02距離控音階

#include <Arduino.h>

#include <Wire.h>

//#include <Servo.h>

#include <SoftwareSerial.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);

#include <IRremote.h>

int RECV_PIN = 11; // 使用數位腳位11接收紅外線訊號

IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入

decode_results results; // 儲存訊號的結構

double angle_rad = PI/180.0;

double angle_deg = 180.0/PI;

void backward();

double rpower;

double lpower;

void left();

void forward();

void right();

void stop();

double ir;

void backward()

{

digitalWrite(7,1);

digitalWrite(8,0);

digitalWrite(9,1);

digitalWrite(10,0);

pinMode(5,OUTPUT);

analogWrite(5,rpower);

pinMode(6,OUTPUT);

analogWrite(6,lpower);

}

void left()

{

digitalWrite(7,0);

digitalWrite(8,1);

digitalWrite(9,0);

digitalWrite(10,0);

pinMode(5,OUTPUT);

analogWrite(5,rpower);

pinMode(6,OUTPUT);

analogWrite(6,lpower);

}

void forward()

{

digitalWrite(7,0);

digitalWrite(8,1);

digitalWrite(9,0);

digitalWrite(10,1);

pinMode(5,OUTPUT);

analogWrite(5,rpower);

pinMode(6,OUTPUT);

analogWrite(6,lpower);

}

void right()

{

digitalWrite(7,0);

digitalWrite(8,0);

digitalWrite(9,0);

digitalWrite(10,1);

pinMode(5,OUTPUT);

analogWrite(5,rpower);

pinMode(6,OUTPUT);

analogWrite(6,lpower);

}

void stop()

{

digitalWrite(7,0);

digitalWrite(8,0);

digitalWrite(9,0);

digitalWrite(10,0);

pinMode(5,OUTPUT);

analogWrite(5,0);

pinMode(6,OUTPUT);

analogWrite(6,0);

}

void setup(){

pinMode(7,OUTPUT);

pinMode(8,OUTPUT);

pinMode(9,OUTPUT);

pinMode(10,OUTPUT);

lpower = 200;

rpower = 200;

irrecv.enableIRIn(); // 啟動接收

lcd.init();

lcd.backlight();

}

void loop(){

if (irrecv.decode(&results)) {

// Serial.println(results.value, HEX);

ir=results.value;

irrecv.resume(); // Receive the next value

}

delay(100);

lcd.clear();

lcd.print("Right: ");

lcd.print(rpower);

lcd.setCursor(1, 1);

lcd.print("Left: ");

lcd.print(lpower);

delay(100);

if(((ir)==(16736925))){

forward();

}

if(((ir)==(16754775))){

backward();

}

if(((ir)==(16720605))){

left();

}

if(((ir)==(16761405))){

right();

}

if(((ir)==(16712445))){

stop();

}

if(((ir)==(16738455))){

if((lpower) < (255)){

lpower += 5;

}

}

if(((ir)==(16724175))){

if((lpower) > (0)){

lpower += -5;

}

}

if(((ir)==(16756815))){

if((rpower) < (255)){

rpower += 5;

}

}

if(((ir)==(16743045))){

if((rpower) > (0)){

rpower += -5;

}

}

if(((ir)==(16750695))){

if((lpower) < (255)){

lpower += 5;

}

if((rpower) < (255)){

rpower += 5;

}

}

if(((ir)==(16718055))){

if((rpower) > (0)){

lpower += -5;

}

if((rpower) > (0)){

rpower += -5;

}

}

}