sumo Force hand
จอย spi
Arudino IDE Code
#include <Servo.h>
#include <PS2X_lib.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>
Adafruit_SSD1306 OLED(-1);
///////////////////////////////////////////////////////////////////////////////
#define PS2_CLK 14 // ขา CLK เป็นขา 14 เทียบเท่าขา A0 ใน Arduino Nano
#define PS2_CMD 15 // ขา CMD เป็นขา 15 เทียบเท่าขา A1 ใน Arduino Nano
#define PS2_SEL 16 // ขา CS เป็นขา 16 เทียบเท่าขา A2 ใน Arduino Nano
#define PS2_DAT 17 // ขา DAT เป็นขา 17 เทียบเท่าขา A3 ใน Arduino Nano
///////////////////////////////////////////////////////////////////////////////
PS2X ps2x;
//////////////// ตั้งขาตัวแปรเซอร์โวมอเตอร์ ////////
int ss1 = 10; // เปิดใช้งาน s1 ที่พอร์ต 10
int ss2 = 11; // เปิดใช้งาน s1 ที่พอร์ต 11
int ss3 = 12; // เปิดใช้งาน s1 ที่พอร์ต 12
Servo sv1; // ประกาศการใช้งาน sv1
Servo sv2; // ประกาศการใช้งาน sv2
Servo sv3; // ประกาศการใช้งาน sv3
////////////ตั้งค่าพอร์ตมอเตอร์////////////////////
#define DR1 7 /// กำหนดสัญญาณดิจิตอลขวาที่ 1 พอร์ต 7
#define DR2 8 /// กำหนดสัญญาณดิจิตอลขวาที่ 2 พอร์ต 8
#define PWMR 6 /// กำหนดสัญญาณ PWM ขวาพอร์ต 6
/////////////////////////////////
#define DL1 9 // กำหนดสัญญาณดิจิตอลซ้ายที่ 1 พอร์ต 9
#define DL2 4 // กำหนดสัญญาณดิจิตอลซ้ายที่ 2 พอร์ต 4
#define PWML 5 /// กำหนดสัญญาณ PWM ซ้ายพอร์ต 5
//////////////////////////////////////////////
int servo_x = 90; // ตัวแปรสำหรับเก็บองศาของเซอร์โวที่ใช้หนีบวัตถุ
int servo_y = 90; // ตัวแปรสำหรับเก็บองศาของเซอร์โวที่ใช้ยกแขนจับ
boolean isR1 = false; // สภานะของปุ่ม R1
boolean isR2 = false; // สภานะของปุ่ม R2
boolean isL1 = false; // สภานะของปุ่ม L1
boolean isL2 = false; // สภานะของปุ่ม L2
/////////////////////////////ฟังก์ชันมอเตอร์///////////////////////////////////
void run(int spl, int spr) // ประกาศฟังก์ชัน run(กำลังมอเตอร์ซ้าาย,กำลังมอเตอร์ขวา);
{
if (spl > 0)
{
digitalWrite(DL1, LOW);
digitalWrite(DL2, HIGH);
analogWrite(PWML, spl);
}
else if (spl < 0)
{
digitalWrite(DL1, HIGH);
digitalWrite(DL2, LOW);
analogWrite(PWML, -spl);
}
else
{
digitalWrite(DL1, LOW);
digitalWrite(DL2, LOW);
}
//////////////////////////////////////
if (spr > 0)
{
digitalWrite(DR1, LOW);
digitalWrite(DR2, HIGH);
analogWrite(PWMR, spr);
}
else if (spr < 0)
{
digitalWrite(DR1, HIGH);
digitalWrite(DR2, LOW);
analogWrite(PWMR, -spr);
}
else
{
digitalWrite(DR1, LOW);
digitalWrite(DR2, LOW);
}
}
/////////////////แสดงโลโก้โลตัส อาดุยบอท/////////////////////////
const unsigned char logo [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x62, 0x40, 0x01, 0x00, 0x24, 0x82, 0x08, 0x0a, 0x18,
0x6f, 0xc0, 0x07, 0x80, 0x7f, 0xef, 0xdf, 0x3f, 0xd8,
0x63, 0x80, 0x3f, 0xf8, 0xee, 0x67, 0x06, 0x70, 0xc8,
0x63, 0x00, 0x1f, 0xf0, 0xce, 0x63, 0x04, 0x70, 0xd8,
0x63, 0x80, 0x3e, 0xf8, 0x06, 0x07, 0x86, 0x3e, 0x18,
0x63, 0x80, 0x78, 0x78, 0x0e, 0x07, 0x0c, 0x1f, 0xd8,
0x63, 0x00, 0xfc, 0x3e, 0x0e, 0x03, 0x06, 0x0b, 0xe8,
0x63, 0x86, 0x38, 0x78, 0x0e, 0x07, 0x04, 0x60, 0xf8,
0x63, 0x8c, 0x3f, 0xf8, 0x06, 0x03, 0x8c, 0x70, 0xe8,
0x67, 0xfc, 0x3f, 0xf0, 0x0f, 0x03, 0xdc, 0x7d, 0xd8,
0x6f, 0xb8, 0x3f, 0xf8, 0x1f, 0x01, 0xf0, 0x2f, 0x98,
0x60, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08,
0x60, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x60, 0x87, 0xe7, 0xc7, 0x37, 0x7e, 0x1e, 0x3f, 0x18,
0x61, 0x86, 0x67, 0x73, 0x33, 0x33, 0x33, 0x6d, 0x18,
0x63, 0xc6, 0x32, 0x33, 0x23, 0x13, 0x61, 0x8c, 0x88,
0x63, 0xc7, 0xe6, 0x33, 0x32, 0x3e, 0x61, 0x8c, 0x18,
0x63, 0xe6, 0xc3, 0x32, 0x13, 0x33, 0x63, 0x8c, 0x18,
0x66, 0x66, 0x66, 0x33, 0x23, 0x33, 0x31, 0x8c, 0x08,
0x66, 0x77, 0x77, 0xe3, 0xe7, 0x3f, 0x3f, 0x1c, 0x18,
0x64, 0x40, 0x11, 0x00, 0x04, 0x48, 0x04, 0x02, 0x18,
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
/////////////////////////////////////////////////////////////////////
void setup()
{ OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C); // กำหนดแอดเดรสของพอร์ตจอเป็น 0x3C (for the 128x64)
////////กำหนดสัญญาณทุกขาเป็น OUTPUT /////////
OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
OLED.clearDisplay();
OLED.drawBitmap(40,20,logo,70,32,1); //40,20 is x,y coordinates and 70,32 พิกเซล is image size
OLED.display();
pinMode(DL1, OUTPUT);
pinMode(DL2, OUTPUT);
pinMode(PWML, OUTPUT);
pinMode(DR1, OUTPUT);
pinMode(DR2, OUTPUT);
pinMode(PWMR, OUTPUT);
sv1.attach(ss1); // เรียกใช้งานเตรียมตอบสนองเซอร์โว sv1
sv2.attach(ss2); // เรียกใช้งานเตรียมตอบสนองเซอร์โว sv2
sv3.attach(ss3); // เรียกใช้งานเตรียมตอบสนองเซอร์โว sv3
while(true) // วนรอบเพื่อเชื่อมต่อจอย PS2
{
// กำหนดขาที่จะเชื่อมต่กับ PS2 Controller โดยมีการเก็บค่าที่ส่งกลับมาเป็น Integer เพื่อรู้ได้ว่าเชื่อมต่อได้หรือไม่
int error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, false, false);
if(error == 0) // หากเชื่อมต่อได้ (Error = 0)
{
tone(3,900,100);delay(200);tone(3,1100,100);break; //ส่งเสียงแล้วออกจากวนรอบ
}
delay(300); // วนรอบทุกๆ0.3 วินาทีกรณีที่เชื่อมต่อไม่ติด
}
}
void loop()
{
ps2x.read_gamepad(false, false); // อ่านข้อมูล PS2 Controller
if(ps2x.Button(PSB_R1)) // R1 ถูกกด
isR1 = true; // isR1 เป็น True
else // R1 ไม่ถูกกด
isR1 = false; // isR1 เป็น False
if(ps2x.Button(PSB_R2)) // R2 ถูกกด
isR2 = true; // isR2 เป็น True
else // R2 ไม่ถูกกด
isR2 = false; // isR2 เป็น False
if(ps2x.Button(PSB_L1)) // L1 ถูกกด
isL1 = true; // isL1 เป็น True
else // L1 ไม่ถูกกด
isL1 = false; // isL1 เป็น False
if(ps2x.Button(PSB_L2)) // L2 ถูกกด
isL2 = true; // isL2 เป็น True
else // L2 ไม่ถูกกด
isL2 = false; // isL2 เป็น False
if(ps2x.Button(PSB_TRIANGLE)) // เมื่อปุ่มสามเหลี่ยมถูกกด
{ sv1.write(-1); // ผ่อนเซอร์โวทั้งสองตัว
sv2.write(-1);
}
if(ps2x.Button(PSB_PAD_UP)) // ถ้าปุ่มขึ้นถูกกด
run(150,150); // วิ่งตรง
else if(ps2x.Button(PSB_PAD_DOWN)) // ถ้าปุ่มลงถูกกด
run(-120,-120); // ถอยหลัง
else if(ps2x.Button(PSB_PAD_LEFT)) // ถ้าปุ่มซ้ายถูกกด
run(-100,100); // เลี้ยวซ้าย
else if(ps2x.Button(PSB_PAD_RIGHT)) // ถ้าปุ่มขวาถูกกด
run(100,-100); // เลี้ยวขวา
else // นอกเหนือจากทุกกรณี
run(0,0); // มอเตอร์หยุด
//////////////////////////////หนีบ-อ้า//////////////////////////////////////////////////
if(isR1) // isR1 ถูกกด : หนีบวัตถุ
{
run(255,255);
}
else if(isR2) // เมื่อสถานะของ isR2 เป็น True (ถูกกด) : ปล่อยวัตถุ
{
tone(3,1500,100);
}
////////////////////////////ยก-ลง//////////////////////////////////////////////////////
else if(isL1) // isL1 (ถูกกด) : แขนกลลดระดับ
{
run(255,255);
}
else if(isL2) // isL2 (ถูกกด) : แขนกลยกขึ้น
{
tone(3,1000,100);
}
delay(50); // หน่วงเวลา 50 มิลลิวินาที
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////