RQ-7 ROBOT
POP-7
หลักการระบบควบคุม
อินพุต เอาต์พุตประมวลผล
ป้อนกลับ
ต้นกาเนิด Arduino
หน้าต่างช่วยเหลือ Reference
• ชุดคาสั่ง
• ไลบรารี่
• ตัวแปร
• คาสงวน
ต้นกาเนิด POP-7 : Hardware
Arduino UNO
POP-7
POP-7 : Software
POP-7
Edit + Compile + Download
C/C++
• ใช้ไมโครคอนโทรลเลอร์ ATMEGA644PA ของบริษัท ATMEL
• ทางานที่ความถี่ 20MHz ทางานที่ความเร็ว 20 ล้านคาสั่งต่อวินาที
• หน่วยความจาโปรแกรม 64 กิโลไบต์
• หน่วยความจา RAM 4 kByte
• หน่วยความจา EEPROM 2 kByte
• จุดต่อเซนเซอร์อะนาลอกได้ 7 ช่อง ความละเอียด 10 บิต
• พอร์ตอินพุต/เอาต์พุตดิจิตอล 16 ช่อง
• I2C / UART / Interrupt /
• มีจอ LCD กราฟิกสีความละเอียด 128x160 พิกเซล
• ขับมอเตอร์ไฟตรงได้ 4 ตัว เซอร์โวมอเตอร์ได้ 3 ตัว
• เชื่อมต่อกับคอมพิวเตอร์ผ่านพอร์ต USB โดยตรงผ่านสาย Mini-B
• มีไฟแสดง สถานะไฟเลี้ยง/แบตเตอรี่ต่า/สถานะ USB /การรับส่งข้อมูลอนุกรม
• ลาโพงเปียโซ/สวิตช์ OK / สวิตช์ SW1/ สวิตช์ Reset/ Knob /
• รองรับไฟเลี้ยง 3-12V ผ่านวงจรสวิตช์ชิ่ง
คุณสมบัติของ POP-7
ส่วนฮาร์ดแวร์ จุดต่อ USB
เตือนแบตอ่อน
แสดงไฟเลี้ยง
แสดงการเชื่อม USB
แสดงการรับส่งข้อมูล
สวิตช์เปิด/ปิด
ขั้วต่อแบตเตอรี่
จุดต่อเซอร์โวมอเตอร์ 1-3
จุดต่อเซนเซอร์
สื่อสารอนุกรม
สื่อสาร I2C
สวิตช์รีเซต
จุดต่อเซนเซอร์
สวิตช์ SW1
ตัวต้านทานปรับค่าได้
สวิตช์ OK
จุดต่อมอเตอร์ 1-2
จุดต่อมอเตอร์ 3-4
128x160
จอสี GLCD
Switch (Digital)
Reflect (Analog)
ปุ่ม OK (Digital)
knob (Analog)
โมดูลวัดระยะทาง
(Analog)
อุปกรณ์อินพุต
อุปกรณ์เอาต์พุต
Servo Motor
DC Motor
ลาโพงเปียโซ
Arduino1.8.5_TPA_Setup180306
ประกอบด้วย
ซอฟต์แวร์ Arduino 1.8.5
ไดรเวอร์ USB
ไลบรารี่ POP-7
http://inex.co.th/shop/index.php/software-download
ติดตั้งซอฟต์แวร์
1 2 3
4 5
หลังจากนี้จะมีหน้าต่างติดตั้ง
ไดรเวอร์
ห้าม Cancel
ขั้นตอนการติดตั้ง
เพื่อให้คอมพิวเตอร์รู้จักกับบอร์ด POP-7ขั้นตอนการติดตั้งไดรเวอร์
ไดรเวอร์ USB
สาหรับ Arduino
ไดรเวอร์ USB
สาหรับ POP-7
เมื่อเปิดใช้งานครั้งแรก
เมื่อเปิดใช้งานครั้งแรก
ตรวจสอบว่าเลือกบอร์ดเป็น POP-7
หรือดูที่มุมขวาล่างของจอภาพ
• 2 เซล 7.4V
• กระแส 1100mA
• จ่ายกระแส 30 เท่า
• ชาร์จ 5 เท่า
แบตเตอรี่ Li-Po
แดง บวก
ดา ลบ
แดง บวก
ดา ลบ
รายละเอียดแบตเตอรี่ ลิเธียม-โพลิเมอร์
1 เซล 3.7V อนุกรมกัน 2 เซล = 7.4V
จ่ายไฟ 1100 mA ต่อเนื่องได้ประมาณ 1 ชั่วโมง
จ่ายกระแสชั่วขณะได้ 1100 x 30 = 33000mA O_o!
ชาร์จได้ 5 เท่า 1100x5 = 5500mA ใช้เวลาประมาณ 20 นาที
วัด Volt อย่างเดียว
แสดงไฟและเตือน
วัดโวลต์และเตือน
ตรวจสอบแรงดันต่า
เตือนแรงดันต่า
กะพริบเมื่อไหร่เปลี่ยนแบตทันที
เครื่องชาร์จแบตเตอรี่
ชาร์จถ่าน Ni-MH
ชาร์จแบต Li-Po
ชาร์จแบตรถยนต์
ต่อสาย USB เข้ากับ POP-7
ต่อสาย USB เข้ากับคอมพิวเตอร์1
2
เปิดสวิตช์จ่ายไฟ
POP-73
4 ไฟสีน้าเงินติดสว่าง
ขั้นตอนเชื่อมต่อกับคอมพิวเตอร์
เลือกพอร์ตสาหรับ POP-7
ถ้าไม่แน่ใจ ให้ลองปิดสวิตช์แล้วตรวจสอบว่าพอร์ตใดหายไป พอร์ตที่หายไปคือ POP-7
ให้เปิดสวิตช์และเลือกพอร์ตนั้น
void setup(){
}
void loop() {
}
สาหรับกาหนดค่า เกิดขึ้นครั้งเดี ว
โปรแกรมหลักทางานต่อเนื่อง
รูปแบบการทางานของโปรแกรม Arduino
#include <pop7.h>
ผนวกรวมชุดคาสั่งสาหรับ POP-7
ทางานใน Setup
ทางานใน Loop
START
โฟลวชาร์ตแสดงการทางาน
#include <pop7.h>
void setup() {
glcd(0,0,"Hello POP-7");
}
void loop() {
}
เริ่มต้นด้วยโปรแกรมแรก
เขียนโปรแกรมผ่าน Arduino
โปรแกรมจะแจ้งให้บันทึกไฟล์ก่อน
คอมไพล์ คีย์ลัด Ctrl+R
แจ้งผลการคอมไพล์และขนาดหน่วยความจาที่ใช้
ถ้ามีข้อผิดพลาด
หน้าต่างนี้จะแจ้งทุกอย่างให้เราทราบ
อัพโหลดโค้ดไปยัง POP-X2
คีย์ลัด Ctrl+U
แจ้งผลการคอมไพล์และขนาดหน่วยความจาที่ใช้
แจ้งผลว่าสมบูรณ์
Hello POP-7
คุณสมบัติของจอภาพ GLCD
glcd แสดงข้อความที่จอ GLCD ได้ 21 ตัว 16 บรรทัด (size 1)
รูปแบบ
glcd(x,y,*p,...)
พารามิเตอร์
x คือตาแหน่งบรรทัดมีค่าตั้งแต่ 0-15
y คือตาแหน่งตัวอักษรมีค่าตั้งแต่ 0-20
*p คือข้อความที่ต้องการนามาแสดง
ค่าพิเศษ
%d แสดงตัวเลขจานวนเต็มในช่วง -32,768 ถึง 32,767
%h แสดงตัวเลขฐานสิบหก
%b แสดงตัวเลขฐานสอง
%l แสดงตัวเลขจานวนเต็มในช่วง -2,147,483,648 ถึง 2,147,483,647
%f แสดงผลตัวเลขจานวนจริง (แสดงทศนิยม 3 หลัก)
ชุดคาสั่งสาหรับควบคุม GLCD
glcd
setTextColor
setTextBackgroundColor
setTextBackgroundTransparent()
setTextSize
glcdClear
glcdFillScreen
glcdMode
glcdPixel
glcdRect
glcdFillRect
glcdLine
glcdCircle
glcdFillCircle
glcdArc
ชุดคาสั่งอื่นๆ สาหรับ glcd
แสดงตัวอักษร แสดงกราฟิก
setTextColor(COLOR)
GLCD_RED, color[0]
GLCD_GREEN, color[1]
GLCD_BLUE, color[2]
GLCD_YELLOW, color[3]
GLCD_BLACK, color[4]
GLCD_WHITE, color[5]
GLCD_CYAN, color[6]
GLCD_MAGENTA color[7]
GLCD_ORANGE color[8]
GLCD_LIME color[9]
GLCD_VIOLET color[10]
GLCD_PINK color[11]
GLCD_DOLLAR color[12]
GLCD_SKY color[13]
GLCD_BROWN color[14]
GLCD_DARKGREEN color[15]
GLCD_NAVY color[16]
GLCD_GRAY color[17]
GLCD_DARKGRAY color[18]
#include <popx2.h>
void setup(){
setTextColor(GLCD_RED);
glcd(0,0,"Hello");
setTextColor(GLCD_GREEN);
glcd(1,0,"World");
}
void loop(){}
colorRGB(R5,G6,B5)
colorRGB(31,63,31)
ค่าสีตัวอักษร setTextColor()
ค่าสีกาหนดเอง
setTextSize()
ตัวอย่าง : setTextSize(4);
ขนาดตัวอักษรเป็น 4 เท่าขนาดปกติ
ปรับขนาดตัวอักษร
ปกติเป็น Mode 0
ตัวอย่าง : glcdMode(1);
การปรับทิศทางตัวอักษร glcdMode();
ค่าสีพื้นหลังตัวอักษร
#include <popx2.h>
void setup(){
setTextBackgroundColor(GLCD_RED);
setTextColor(GLCD_YELLOW);
glcd(0,0,"Hello World");
}
void loop(){}
setTextBackgroundColor(COLOR)
setTextBackgroundColor()
delay(DelayTime);
DelayTime ค่าเวลาหน่วงหน่วยเป็นมิลลิวินาที
คาสั่งหน่วงเวลาค้างที่บรรทัดนี้นานเท่าค่า DelayTime
delay(2000);
ตัวอ ่าง
ค้างที่นี่นาน 2 วินาที
รูปแบบ คาสั่ง delay
glcdClear()
เคลียร์หน้าจอ
glcdFillScreen(COLOR)
เทสีลงบนหน้าจอทั้งหน้า
#include <popx2.h>
void setup(){}
void loop(){
glcdClear();
delay(500);
glcdFillScreen(color[0]);
delay(500);
glcdFillScreen(color[1]);
delay(500);
glcdFillScreen(color[2]);
delay(500);
}
INEX
1. ตัวอักษรมีสีคนละสี
2. วางตัวอักษรในแนวนอน
3. ขนาดตัวอักษร 4 เท่า
4. ตัวหนังสืออยู่กลางจอพอดี
แบบทดสอบ 1 สร้างตัวอักษรหลายสี บนหน้าจอ
แสดงรูปทรงเรขาคณิต : สี่เหลี่ยมผืนผ้า
glcdRect(x,y,width,height,color)
glcdFillRect(x,y,width,height,color)
x ตาแหน่งแนวนอน
y ตาแหน่งแนวตั้ง
width ความกว้าง
height ความสูง
color สี
x
y
height
width
Fill
แสดงรูปทรงเรขาคณิต : วงกลม
x ตาแหน่งจุดศูนย์กลางวงกลมแนวนอน
y ตาแหน่งจุดศูนย์กลางวงกลมแนวตั้ง
radius รัศมีของวงกลม
color สี
glcdCircle(x,y,radius,color)
glcdFillCircle(x,y,radius,color)
x,y
radius
Fill
แสดงรูปทรงเรขาคณิต : เส้นตรง
x1 จุดเริ่มต้นแนวนอน
y1 จุดเริ่มต้นแนวตั้ง
x2 จุดสิ้นสุดแนวตั้ง
y2 จุดสิ้นสุดแนวนอน
color สี
x1,y1
glcdLine(x1,y1,x2,y2,color)
x2,y2
แสดงรูปทรงเรขาคณิต : เส้นโค้ง
x จุดเริ่มต้นแนวนอน
y จุดเริ่มต้นแนวตั้ง
r รัศมีเส้นโค้ง
startAngle มุมเริ่ม
endAngle มุมสิ้นสุด
color สี
x,y
glcdArc(x,y,r,startAngle,endAngle,color)
startAngle(0)
r
endAngle(90)
glcdArc(64,80,64,0,90,GLCD_RED);
แสดงรูปทรงเรขาคณิต : พล็อตจุด
x จุดเริ่มต้นแนวนอน
y จุดเริ่มต้นแนวตั้ง
color สีx,y
glcdPixel(x,y,color)
glcdPixel(64,80,GLCD_WHITE);
แบบทดสอบ 2 สร้างวงกลมสีแดงอยู่กึ่งกลางจอภาพ รัศมีเต็มจอพอดี
ลากเส้น 4 เส้นโดยมีจุดตัดอยู่กลางจอภาพพอดีแบบทดสอบ 3
สร้างสี่เหลี่ยมซ้อนกันดังรูปแบบทดสอบ 4
สร้างสี่เหลี่ยม 4 อัน ขนาดเท่ากันแบบทดสอบ 5
เอาต์พุตดิจิตอลอย่างง่าย : LED
out(ch,state);
ส่งค่าสถานะ(state) 0 หรือ 1
ออกไปยังตาแหน่งขา (ch)ที่ระบุ
out(24,1);
out(26,0);
#include <pop7.h>
void setup(){ }
void loop(){
out(24,1);
delay(100);
out(24,0);
delay(100);
}
ตัวอย่าง : ไฟกะพริบที่ขา 24
เขียนโปรแกรมให้ไฟกะพริบสลับกันแบบทดสอบ 6
ลาโพงเปียโซ (อยู่ใต้จอ)
การสร้างเสียงออกลาโพง
beep()
sound(freq,time)
freq คือ ความถี่เสียง
time คือ เวลา 1/100 วินาที • ใช้ลาโพงเปียโซ มีอิมพีแดนซ์ 32W
• มีค่าความถี่ย่าน 300 Hz ถึง 3000 Hz
#include <pop7.h>
void setup(){}
void loop(){
beep();
delay(500);
}
#include <pop7.h>
void setup(){}
void loop(){
sound(1000,100);
delay(500);
}
ตัวอย่างการใช้งานคาสั่ง beep ตัวอย่างการใช้งานคาสั่ง sound
สร้างเสียง 1 kHz นาน 0.1 วินาที ต่อเนื่องสร้างเสียง 500 Hz นาน 0.1 วินาที ต่อเนื่อง
ตัวอย่างโปรแกรมสร้างเสียงออกลาโพง https://pastebin.com/NnZje3Uw
POP-7 MARIO SOUND EXAMPLE
การรับค่าอินพุตจากสวิตช์ SW1
SW_OK
sw1_press() รอกด SW1 ค่อยไปทาบรรทัดถัดไป
sw1() กดเป็นจริง / ไม่กดเป็นเท็จ
sw_OK_press() รอกด SW_OK ค่อยไปทาบรรทัดถัดไป
sw_OK() กดเป็นจริง / ไม่กดเป็นเท็จ
OK() รอกด SW_OK ค่อยไปทาบรรทัดถัดไป
พร้อมแสดงข้อความที่หน้าจอด้วย
ตัวอย่าง sw1_press()
#include <pop7.h>
void setup() {
sw1_press();
beep();
}
void loop() {}
#include <pop7.h>
void setup() {}
void loop() {
sw1_press();
beep();
}
ตัวอย่าง sw_OK_press()
#include <pop7.h>
void setup() {
sw_OK_press();
beep();
}
void loop() {}
#include <pop7.h>
void setup() {}
void loop() {
sw_OK_press();
beep();
}
if (เงื่อนไข){
คาสั่ง1 ทาเมื่อเงื่อนไขเป็นจริง;
...
}
else {
คาสั่ง2 ทาเมื่อเงื่อนไขเป็นเท็จ;
...
}
คาสั่งตรวจสอบเงื่อนไข if-else
ตัวแปร Boolean
จริง :True : 1
เท็จ :False : 0
ตัวอย่าง sw_OK() ด้วยคาสั่ง if
#include <pop7.h>
void setup() {}
void loop() {
if (sw_OK()){
glcdFillScreen(GLCD_RED);
}
else{
glcdFillScreen(GLCD_BLACK);
}
}
if จะต้องอยู่ใน loop เพื่อการตรวจสอบต่อเนื่อง
ใช้เครื่องหมาย ! (not)
จะเปลี่ยนจากจริงเป็นเท็จ
เปลี่ยนจากเท็จเป็นจริง
ใช้เครื่องหมาย && (AND)
ใช้กับเงื่อนไขสองเงื่อนไข
ถ้าเป็นจริงทั้งคู่ถึงจะเป็นจริง
ใช้เครื่องหมาย || (OR)
ใช้กับเงื่อนไขสองเงื่อนไข
ถ้าอันใดอันหนึ่งจริงจะเป็นจริง
ตัวอย่างการใช้ && (AND)
#include <pop7.h>
void setup() {}
void loop() {
if (sw_OK()&& sw1()){
glcdFillScreen(GLCD_RED);
}
else if (sw_OK()){
glcdFillScreen(GLCD_GREEN);
}
else if (sw1()){
glcdFillScreen(GLCD_BLUE);
}
else{
glcdFillScreen(GLCD_BLACK);
}
}
กดสองปุ่มพร้อมกัน
กดสวิตช์ OK
กดสวิตช์ 1
ไม่กดสวิตช์
กดสวิตช์ = ลอจิก “0”
ไม่กด = ลอจิก “1”
แผงวงจรสวิตช์ : ZX-SWITCH01
อ่านค่าขาดิจิตอลจากพอร์ตใดๆ ของบอร์ด POP-7
in(ch);
ch คือขาพอร์ตที่ต้องการอ่านค่าอินพุต
การคืนค่า คืนค่าขาพอร์ตที่อ่าน มีค่าเป็น 0 หรือ 1 เท่านั้น
คาสั่ง in() : สาหรับอ่านค่าอินพุตดิจิตอล boolean
ทดสอบเขียนโปรแกรมคาสั่ง in() กับ ZX-Switch01
ต่อขา 8
SCL
ต่อขา 9
SDA
#include <pop7.h>
int i=0;
void setup() {}
void loop() {
if(in(8)==0){ beep(); }
if(in(9)==0){ sound(1000,100); }
}
ทดสอบเขียนโปรแกรมคาสั่ง in() กับ ZX-Switch01
รูปแบบ
while(เงื่อนไข) {
ทาคาสั่งจนเงื่อนไขเป็นเท็จ;
}
คาสั่งตรวจสอบเงื่อนไข while
#include <pop7.h>
int i=0;
void setup() {}
void loop() {
if(in(8)==0){
while(in(8)==0){setTextSize(3);}
i++;
glcd(1,1,"%d ",i);
}
}
กดสวิตช์แล้วต้องรอปล่อย ถึงค่อยนับเลข
การเขียนโปรแกรมเพื่อตั้งตัวตรง
#include <pop7.h>
int i=0;
void setup() {}
void loop() {
OK();bk(50);
while(1){
if(!in(8)){
while(in(9)){motor(1,0);motor(2,-100);}ao();break;
}
else if(!in(9)){
while(in(8)){motor(2,0);motor(1,-100);}ao();break;
}
}
}
ด้วยการชนสวิตช์
void bkWall(int Speed){
bk(Speed);
while(1){
if(!in(8)){
while(in(9)){
motor(1,0);motor(2,-100);
}
ao();break;
}
else if(!in(9)){
while(in(8)){
motor(2,0);motor(1,-100);}
ao();break;
} }}
นามาสร้างเป็นฟังก์ชั่น ถอยหลังตั้งตัว
100
ปุ่มปรับเพื่ออ่านค่าอะนาลอก : knob()
หมุนเพื่อปรับค่า 0-1000
glcd(0,0,"%d",knob());
การแสดงผลค่า KNOB() ที่จอ GLCD
ใช้อ่านค่าตัวต้านทานปรับค่าได้บน pop-7
glcd(0,0,"%d ",knob());
แก้ปัญหาเลขเดิมค้างด้วยการเคาะเว้นวรรคเพิ่ม
1000
9990
9990
คาสั่ง knob(x)
รูปแบบ
knob(x); โดย x คือค่า Scale
การคืนค่า
ค่าที่อ่านได้จาก knob มีค่าระหว่าง 0 ไปจนถึงค่า x
ตัวอย่าง
int val=0;
val=knob(180);
glcd("%d ",val);
หน้าจอ glcd แสดงค่าตัวเลข 0-180
รูปแบบ
knob(x,y);
x คือค่า Scale ช่วงเริ่มต้น
y คือค่า Scale ช่วงท้าย
ตัวอย่าง
glcd(1,1,"%d ",knob(10,90));
หน้าจอจะแสดงค่า 10-90 ตามการหมุน knob()
คาสั่ง knob(x,y)
#include <pop7.h>
int x;
void setup(){
setTextSize(3);
}
void loop(){
glcd(1,0,"%d ",knob(128));
glcdFillRect(0,80,knob(128),10,GLCD_RED);
glcdFillRect(knob(128),80,128-knob(128),10,GLCD_BLACK);
}
ตัวอย่าง bar graph เมื่อปรับ knob
motor (CH,POW)
CH 1-4 คือมอเตอร์ 1 ถึงมอเตอร์ 4
ALL,100,ALL2,102,12 มอเตอร์ 1,2 ทางานพร้อมกัน
ALL4,104 คือมอเตอร์ 1 ถึง 4 พร้อมกัน
MR21,121 คือมอเตอร์ มอเตอร์ 1 ถอย มอเตอร์ 2 ไปหน้า
MR12,112 คือมอเตอร์ มอเตอร์ 2 ถอย มอเตอร์ 1 ไปหน้า
34 มอเตอร์ 3,4 ทางานพร้อมกัน POW ความเร็ว -100 ถึง 100
ค่าบวก เดินหน้า
ค่าลบ ถอยหลัง
คาสั่ง motor() : ขับเคลื่อนมอเตอร์
motor_stop ห ุดขับมอเตอร์ตามช่องที่กาหนด
รูปแบบ
motor_stop(ch)
ch คือช่อง 1 ถึง 4 และ ALL กรณีห ุดพร้อมกัน
motor_stop(1); มอเตอร์ 1 หยุด
motor_stop(2); มอเตอร์ 2 หยุด
ao() ; มอเตอร์ 2 ตัวหยุดพร้อมกัน
คาสั่ง motor_stop() : หยุดมอเตอร์
เดินหน้า
fd(speed);
ถอ หลัง
bk(speed);
เลี้ วซ้า
sl(speed);
เลี้ วขวา
sr(speed);
tl(speed);
เลี้ วด้านเดี ว
tr(speed);
ห ุดหุ่น นต์
ao();
speed = 0-100
motor1 motor2 motor1 motor2
motor1 motor2 motor1 motor2
สรุปคาสั่ง เพื่อขับเคลื่อนหุ่นยนต์
สรุปคาสั่ง เพื่อขับเคลื่อนหุ่นยนต์
fd(Speed); เดินหน้า
bk(Speed); ถอยหลัง
sl(Speed); เลี้ยวซ้าย
sr(Speed); เลี้ยวขวา
Speed คือความเร็วหุ่นยนต์ 0-100
ao() ;หยุด
tl(Speed); เลี้ยวซ้ายล้อเดียว
tr(Speed); เลี้ยวขวาล้อเดียว
ทดสอบ เดินหน้า 1 วินาที ถอยหลัง
#include <pop7.h>
void setup(){OK();}
void loop(){
fd(50); delay(1000);
bk(50); delay(1000);
}
ทดสอบ เดินวนเป็นสี่เหลี่ยม
#include <pop7.h>
void setup(){OK();}
void loop(){
fd(50); delay(1000);
sr(50); delay(600);
}
fd2(Speed1,speed2); เดินหน้า
bk2(Speed1,speed2); ถอ หลัง
Speed1 คือมอเตอร์ด้านซ้า
Speed2 คือมอเตอร์ด้านขวา
ความแม่นยาของการเคลื่อนที่ตรง
มอเตอร์ 2 เร็วกว่ามอเตอร์ 1
การวัดค่าระยะทางด้วย Encoder
encoder(CH);
CH ขาที่ต่อ encoder 2,3,18
คืนค่าการนับที่ Encoder
encoder(CH,0);
CH ขาที่ต่อ encoder 2,3,18
เคลียร์ค่าการนับให้กับ encoder
while(encoder(2)<40){fd(50);}
ทดสอบ เดินด้วยระยะทาง 17.4 CM
#include <pop7.h>
void setup(){}
void loop(){
OK(); encoder(2,0);
fd(50);
while(encoder(2)<40);ao();
}
เส้นรอบวง
= D
= 3.14 x 5.4
= 17 CM
ทดสอบ อ่านค่าระยะทางโชว์หน้าจอ
#include <pop7.h>
int x;
void setup(){
OK();
encoder(2,0);
}
void loop(){
glcd(0,0,"%d ",encoder(2));
if(sw1()){encoder(2,0);}
}
ลองเลื่อนหุ่นยนต์แล้ว ดูค่าที่แสดงที่หน้าจอ กดสวิตช์ SW1 เพื่อเคลียร์
10.5 CM
ทดสอบ เลี้ยว 90 องศาด้วย tl
#include <pop7.h>
void setup(){}
void loop(){
OK();
encoder(3,0);
tl(50);
while(encoder(3)<39);ao();
}
ทดสอบ เลี้ยว 90 องศาด้วย tl
จุดหมุน
#include <pop7.h>
void setup(){}
void loop(){
OK();
encoder(3,0);
sl(30);
while(encoder(3)<18);ao();
}
ทดสอบ เลี้ยว 90 องศาด้วย sl
จุดหมุน
#include <pop7.h>
void setup(){OK();}
void loop(){
encoder(3,0);fd(30);
while(encoder(3)<40);
encoder(3,0);sl(30);
while(encoder(3)<20);
}
ทดสอบ เดินวนเป็นรูปสี่เหลี่ยม
#include <pop7.h>
void setup(){OK();}
void loop(){
fdEnc(30,40);
slEnc(30,20);
}
void fdEnc(int speed,int ENC){
encoder(3,0);fd(speed);
while(encoder(3)<ENC);
}
void slEnc(int speed,int ENC){
encoder(3,0);sl(30);
while(encoder(3)<20);
}
นามาสร้างเป็นฟังก์ชั่น เดินวนเป็นรูปสี่เหลี่ยม
void fdEnc(int Speed,int ENC){
encoder(3,0);fd(Speed);
while(encoder(3)<ENC);
}
void slEnc(int Speed,int ENC){
encoder(3,0);sl(Speed);
while(encoder(3)<ENC);
}
void srEnc(int Speed,int ENC){
encoder(2,0);sl(Speed);
while(encoder(2)<ENC);
}
สรุปฟังก์ชั่นที่ใช้
แกนหมุน 180 องศา
สัญญาณ (S)
GND (-)
สัญญาณ (S)
การใช้งานเซอร์โวมอเตอร์
ไฟเลี้ ง (+) GND (-)
servo(CH,POS);
CH ช่องที่ใช้ขับ = 1 ถึง 3
POS ตาแหน่งองศาเซอร์โว = 0-180 ,-1
ค่า -1 หมา ถึงห ุดจ่า สัญญาณให้เซอร์โว
เซอร์โวจะไม่ล็อกแกน
ฟังก์ชั่นขับเซอร์โวมอเตอร์
Servo1 Servo2
#include <pop7.h>
word x;
void
setup(){setTextSize(3);}
void loop(){
x=knob(180);
servo(1,x);
glcd(1,1,"%d ",x);
}
ทดสอบหาตาแหน่งของ Servo1
#include <pop7.h>
word x;
void
setup(){setTextSize(3);}
void loop(){
x=knob(180);
servo(2,x);
glcd(1,1,"%d ",x);
}
ทดสอบหาตาแหน่งของ Servo2
#include <pop7.h>
void setup(){setTextSize(3);}
void loop(){
sw1_press();sHome();
sw1_press();sKeep();
}
void sHome(){
servo(1,170);servo(2,5);
}
void sKeep(){
servo(1,70);servo(2,95);
}
สร้างฟังก์ชั่น และเรียกใช้ด้วยการกดปุ่ม SW1
sHome
sKeep
แผงวงจรตรวจจับแสงสะท้อน: ZX-03
รูปแบบ
analog(CH)
CH คือช่องอะนาลอก (สีแดง) A0-A6 ที่ต้องการอ่านค่า
การคืนค่า ค่าอะนาลอกที่มีค่าอยู่ระหว่าง 0-1023
ตัวอย่าง
glcd(1,1,"%d ",analog(0));
ฟังก์ชั่น analog
เป็นการนาค่าที่อ่านได้จากช่อง A0 แสดงที่หน้าจอ GLCD
#include <pop7.h>
void setup(){}
void loop(){
glcd(1,1,"L=%d ",analog(0));
delay(100);
}
โปรแกรมอ่านค่าจาก ZX-03 แสดงที่ GLCD
#include <pop7.h>
void setup(){
setTextSize(3);
glcdMode(3);
}
void loop(){
glcd(1,1,"L=%d ",analog(0));
glcd(3,1,"R=%d ",analog(1));
}
A0 A1A2 A3
ผลลัพธ์การอ่านค่าการสะท้อน
อ่านค่าพื้นผิวสีขาวอ่านค่าพื้นผิวสีดา
ค่าที่อ่านได้เปลี่ยนแปลงตามความสูงเซนเซอร์จากพื้น
#include <pop7.h>
void setup(){
OK();
fd(100);
while(analog(0)>250);
ao();
glcd(1,1,"Stop... ");
}
void loop(){}
มาจากค่ากลาง
ระหว่างขาวกับดา
(450+50)/2
หุ่น นต์เคลื่อนที่ห ุดที่เส้นดา
รูปแบบหุ่น นต์เคลื่อนที่ตามเส้น
1
if(L>250&&R>250){
fd(60);
}
เมื่อซ้า และขวาเจอขาว
เดินตรงไป
รูปแบบหุ่น นต์เคลื่อนที่ตามเส้น
2
if(L<250&&R>250){
sl(60);
}
เมื่อซ้า เจอดาและขวาเจอขาว
เลี้ วซ้า
3
if(L>250&&R<250){
sr(60);
}
เมื่อซ้า เจอขาวและขวาเจอดา
เลี้ วขวา
รูปแบบหุ่น นต์เคลื่อนที่ตามเส้น
4
if(L<250&&R<250){
fd(60);
delay(200);
}
เมื่อซ้า เจอดาและขวาเจอดา
เดินตรงข้ามทางแ ก
รูปแบบหุ่น นต์เคลื่อนที่ตามเส้น
ตัวอ ่างการทาสนามด้ว เทปพันสา ไฟ
เจอเส้นตัดส่งเสี งติ๊ดออกลาโพง
ZX-03R ZX-03G ZX-03B
ส่องแสงสีแดง ส่องแสงสีเขียว ส่องแสงสีน้าเงิน
แผงวงจรตรวจจับแสงสะท้อน: ZX-03
#include <pop7.h>
void setup() {glcdMode(3);
setTextSize(3);}
void loop() {
glcd(0,0,"I=%d ",analog(0));
glcd(1,0,"R=%d ",analog(1));
glcd(2,0,"G=%d ",analog(2));
glcd(3,0,"B=%d ",analog(3));
}
แผงวงจรตรวจจับแสงสะท้อน: ZX-03
A0 A1 A2 A3
#include <pop7.h>
unsigned int R=0,G=0,B=0,I=0,a;
void setup() {glcdMode(3); setTextSize(3);}
void loop() {
I=0;for(a=0;a<40;a++){I=analog(0)+I;}I=I/40;
R=0;for(a=0;a<40;a++){R=analog(1)+R;}R=R/40;
G=0;for(a=0;a<40;a++){G=analog(2)+G;}G=G/40;
B=0;for(a=0;a<40;a++){B=analog(3)+B;}B=B/40;
glcd(0,0,"I=%d ",I);
glcd(1,0,"R=%d ",R);
glcd(2,0,"G=%d ",G);
glcd(3,0,"B=%d ",B);
อ่านค่าทั้ง 4 แบบ โชว์ GLCD แบบค่าเฉลี่ย
#include <pop7.h>
int R,G,B;
void setup() {glcdMode(3); setTextSize(3);}
void loop() {
R=analog(1);G=analog(2);B=analog(3);
if(R>900){
if(G>900){glcd(0,0,"White ");}
else if(G>400){glcd(0,0,"Yellow ");}
else {glcd(0,0,"Red ");}
}
else if(R>500){
if(G>500){glcd(0,0,"Grey ");}
else {glcd(0,0,"Magenta");}
}
else { glcd(0,0,"Green "); }
}
ทดสอบอ่านค่าสีด้วย if
#include <pop7.h>
int R,G,B,C;
void setup() {glcdMode(3); setTextSize(3);}
void loop() {
R=analog(1);G=analog(2);B=analog(3);
if(R>900){
if(G>900){C=1;}
else if(G>400){C=2;}
else {C=3;}
}
else if(R>500){
if(G>500){C=4;}
else {C=5;}
}
else {C=6;}
glcd(0,0,"%d ",C);
}
ทดสอบอ่านค่าสีด้วย if เก็บค่าในตัวแปร
1 =White
2=Yellow
3 Red
4=Magenta
5=Grey
6=Green
เปลี่ยนเป็น Function
int readColor() {
R=analog(1);G=analog(2);B=analog(3);
if(R>900){
if(G>900){C=1;}
else if(G>400){C=2;}
else {C=3;}
}
else if(R>500){
if(G>500){C=4;}
else {C=5;}
}
else {C=6;}
return C;
}
glcd(0,0,"%d ",readColor());
1 =White
2=Yellow
3 Red
4=Magenta
5=Grey
6=Green
คุณสมบัติหลัก
•ทางานที่ไฟเลี้ยง 5 โวลต์
•วัดระยะทางใช่วงตั้งแต่ 4 ถึง 32 เซนติเมตร
โมดูลวัดระยะทางแบบอินฟราเรด: GP2D120/GP20A41
หลักการวัดระยะทาง
รูปแบบ
getdist(ch)
ch คือขาพอร์ตอะนาลอกที่เชื่อมต่อ
คืนค่า : ระยะทางช่วง 4-32 CM
ฟังก์ชั่น getdist(CH) เพื่ออ่านค่าระยะทางหน่วยเป็นเซนติเมตร
ทดสอบอ่านค่า ทั้งค่าดิบและเป็นเซนติเมตร
#include <pop7.h>
int D;
void setup() {setTextSize(3);}
void loop() {
D=getdist(4);
glcd(2,1,"%d ",analog(4));
glcd(1,1,"%d ",D);
}
7
330GP2Y0A41 ต่อช่อง A4
ทดสอบอ่านค่า แบบหาค่าเฉลี่ย
#include <pop7.h>
unsigned int R,D,i;
void setup() {setTextSize(3);}
void loop() {
R=0;
for(i=0;i<20;i++){R=analog(4)+R;}
R=R/20;
D=getdist(4);
glcd(2,1,"%d ",R);
glcd(1,1,"%d ",D);
}
7
330
GP2Y0A41 ต่อช่อง A4
ฟังก์ชั่น เก็บค่าเฉลี่ย จาก GP2Y0A41
int GP2AV(){
int R=0;
for(i=0;i<20;i++){
R=analog(4)+R;
}
return (R/20);
}
GP2Y0A41 ต่อช่อง A4
ทดสอบ เดินเข้าใกล้กาแพงแล้วเลี้ยวขวา 90 องศา
เจอกาแพงหมุนตัว 180 องศา พร้อมเช็คตั้งตัว
#include <pop7.h>
int i,R;
void setup() {OK();}
void loop() {
fd(50);
while(GP2AV()<250);
srEnc(30,30);
bkWall(60);
bk(40);delay(300);
}
millis จะเพิ่มค่าขึ้นทีละ 1 ทุก ๆ 1 มิลลิวินาที
millis จะทางานอยู่เบื้องหลังด้วย Interrupt Timer
millis ใช้ตัวแปร Long ในการเก็บค่า (4 ไบต์)
4,294,967,296 มิลลิวินาที ก่อนเคลียร์เป็น 0
ฟังก์ชั่น millis()
49.7 วัน
#include <pop7.h>
int T1,T2;
bool S1=0,S2=0,S3=0;
void setup() {
T1=millis(); // โหลดค่าเวลา
T2=millis(); // โหลดค่าเวลา
}
void loop() {
if (millis()>T1+350){ // เทียบเวลาปัจจุบัน + 0.35 วินาที
T1=millis(); // Reload
if(S1){out(24,1);S1=0;}
else{out(24,0);S1=1;}
}
if (millis()>T1+400){ // เทียบเวลาปัจจุบัน + 0.4 วินาที
T1=millis(); // Reload
if(S1){out(26,1);S1=0;}
else{out(26,0);S1=1;}
}
}
ตัวอย่างการใช้งาน millis()
attachInterrupt(pin, ISR, mode)
pin ตาแหน่งขาที่รับอินเตอร์รัปต์
ISR ตาแหน่งฟังก์ชั่นที่เรียกบริการ Interrupt
mode รูปแบบการกระตุ้น Interrupt
LOW กระตุ้นเมื่อขาเป็น 0
CHANGE กระตุ้นเมื่อมีการเปลี่ยนค่า
RISING กระตุ้นที่ขอบขาขึ้น
FALLING กระตุ้นที่ขอบขาลง
การใช้งานอินเตอร์รัปต์กับ pop-7 ใช้ได้ที่ขา 2,3 และ 18
#include <pop7.h>
void setup() {
attachInterrupt(18,Prog1,CHANGE);
attachInterrupt(2,Prog2,CHANGE);
}
void loop() {
out(24,1);delay(100);
out(24,0);delay(100);
}
void prog1() { out(26,1);}
void prog2() { out(26,0);}
ตัวอย่างการใช้งานอินเตอร์รัปต์
delay(DelayTime);
DelayTime ค่าเวลาหน่วงหน่วยเป็นมิลลิวินาที
คาสั่งหน่วงเวลาค้างที่บรรทัดนี้นานเท่าค่า DelayTime
delay(2000);
ตัวอ ่าง
ค้างที่นี่นาน 2 วินาที
รูปแบบ คาสั่ง delay
byte
0-65535 (unsigned int)word
0-255 (unsigned char)
0-1boolean True False
-32768 ถึง 32767int
-128 ถึง 127char
-3.4 x 1038 ถึง 3.4 x 1038float
หาข้อมูลเพิ่มเติมจาก reference
ตัวแปรชนิดต่างๆ
1 Byte
2 Byte
1 bit
2 Byte
1 Byte
4 Byte
if (เงื่อนไข){
คาสั่ง1 ทาเมื่อเงื่อนไขเป็นจริง;
...
}
else {
คาสั่ง2 ทาเมื่อเงื่อนไขเป็นเท็จ;
...
}
คาสั่งตรวจสอบเงื่อนไข if-else
ตัวแปร Boolean
จริง :True : 1
เท็จ :False : 0
รูปแบบ
while(เงื่อนไข) {
ทาคาสั่งจนเงื่อนไขเป็นเท็จ;
}
คาสั่งตรวจสอบเงื่อนไข while
#include <pop7.h>
int i=0;
void setup() {}
void loop() {
if(in(8)==0){
while(in(8)==0){}
i++;
glcd(1,1,"%d ",i);
}
}
กดสวิตช์แล้วต้องรอปล่อย ถึงค่อยนับเลข
ออกจาก while แบบทันทีได้ด้วยคาสั่ง
break;
for (ค่าเริ่มต้น; เงื่อนไข ;ส่วนเพิ่มค่า){
ทาคาสั่ง จนครบเงื่อนไข;
}
คาสั่งตรวจสอบเงื่อนไข for
#include <pop7.h>
int i;
void setup() {
for(i=0;i<10;i++){
glcdFillScreen(color[i]);
delay(200);
}
}
void loop() {}
เปลี่ยนสีหน้าจอ 10 รอบ
void R90(int x){
ชุดคาสั่ง
y=x+2;
.
}
ชื่อฟังก์ชั่น ตัวแปรที่ส่งไป ังฟังก์ชั่น
ชุดคาสั่งในฟังก์ชั่น
R90(200);
รูปแบบการสร้างฟังก์ชั่น ไม่คืนค่า
ไม่คืนค่า
int R90(int x){
ชุดคาสั่ง
y=x+2;
return y;
}
ชื่อฟังก์ชั่น ตัวแปรที่ส่งไป ังฟังก์ชั่น
ชุดคาสั่งในฟังก์ชั่น
Val = R90(200);
รูปแบบการสร้างฟังก์ชั่น คืนค่า
ชนิดตัวแปร
ของการคืนค่า
คืนค่าผลลัพธ์
map(value, fromLow, fromHigh, toLow, toHigh)
y = map(x, 1, 50, 50, 1);
ตัวอย่าง
y = map(x, 1, 50, 50, -100);
ตัวอย่าง
การใช้งานคาสั่ง map
เพื่อเปลี่ยนช่วงของค่าตัวเลขจากช่วง x ไปเป็นช่วง y
y = map(analog(4), 0, 1023, 0, 180);
กฤษดา ใจเย็น
บริษัท อินโนเวตีฟ เอ็กเพอริเมนต์ จากัด
108 ซอยสุขุมวิท 101/2 ถ.สุขุมวิท
แขวงบางนา เขตบางนา กรุงเทพฯ 10260
โทรศัพท์ 027477001-4 โทรสาร 02-7477005
www.inex.co.th
facebook.com/innovativeexperiment
KRITSADA JAIYEN
kritsada@inex.co.th

POP-7 Robot with RQ-7 Platform (PDF)