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;
}
}
}