Litar dan pengaturcaraan ada di halaman sohoROBOT. KLIK DI SINI
GURU DAN MURID BOLEH BERKONGSI IDEA UNTUK MEMBANGUNKAN PROJEK DI BAWAH DENGAN EMAIL KAMI
PENGATURCARAAN TAPAK PENGECAS DALAM PENGUJIAN
//NAZRON AHMAD
//nazronahahmad83@gmail.com
//01/01/2021
String h="0"; //
// myId = 1 ~ 254
#define myId 201 //id pengecas
char serialMsg[10];
char bufferMsg[10];
int ledL=13;
int ledR=12;
unsigned long pingMasa=0;
bool tunggu = 0;
int pulseR=0;
int pulseL=0;
void setup() {
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(ledL,HIGH);
pinMode(ledR,HIGH);
attachInterrupt(digitalPinToInterrupt(2), trig1, FALLING);
attachInterrupt(digitalPinToInterrupt(3), trig2, FALLING);
Serial.begin(9600);
delay(500);
}
///////////////////terimaMsg////////////////////////
bool terimaMsg(){
static char *cp = bufferMsg;
bool idMatch = false;
if (!Serial.available()){
return false;
}
// mengesah id pengecas
if(Serial.available()){
int thisid = (int)Serial.read();
if (thisid == myId)
idMatch=true;
delay(3);
}
while (Serial.available()) {
*cp=(char)Serial.read();
delay(3);
if ((*cp == '\n') || (*cp == '\r') ||(cp - bufferMsg >= 10))
{
*cp='\0';
cp=bufferMsg;
if (idMatch)
strcpy(serialMsg,bufferMsg);// bufferMsg di salin ke serialMsg
return idMatch;
}
else {
cp++;
}
}
}
//////////////////terima isyarat/////////////////////
void trig1(){
if (millis() - pingMasa > 10) {// keluar bila sudah lebih 10 pulse
tunggu=false ;
return;// tidak akan meneruskan code di bawah
}
pulseR++;
if (h=="0" && tunggu) {
h="R"; // penderia yang menerima pulse
digitalWrite(ledR,HIGH);
delay(500);
digitalWrite(ledR,LOW);
delay(500);
tunggu=false;
}
}
void trig2(){
if (millis() - pingMasa > 10) { // keluar bila sudah lebih 10 pulse
tunggu=false ;
return;// tidak akan meneruskan code di bawah
}
pulseL++;
if (h=="0" && tunggu){
h="L"; // penderia yang menerima pulse
digitalWrite(ledL,HIGH);
delay(500);
digitalWrite(ledL,LOW);
delay(500);
tunggu=false;
}
}
///////////////////void loop/////////////////////////////////
void loop() {
int pc=0;
if (terimaMsg()){
if (serialMsg[0]=='P'){
pingMasa=millis();
tunggu=1;
delay(30);
}
serialMsg[0]='\0';
}
if (h!="0") {
hantarMsg(200,h) ;// hantar signal dari pengecas L atau R
delay(50);
h="0";
}
}
///////////////tamat viod loop//////////////////////////
////////////////hantarMSg////////////////////////////////
void hantarMsg(int id,String message){
Serial.write(id);// hantar id sohoROBOT
Serial.println(message); // penderia L atau R // jumlah pulse
}
PENGATURCARAN ROBOT DALM PENGUJIAN
//NAZRON AHMAD
//nazronahahmad83@gmail.com
//01/01/2021
#include <Servo.h>
Servo servo_motor;
# define A1A 5
# define A1B 6
# define B1A 9
# define B1B 10
# define trig 12
# define echo 13
#define bumberR 2
#define bumberL 3
int bumperhit=0;
#define myId 200// id robot
char serialmsg[10];
char buffermsg[10];
////////////////////////////////////
#define bateriLemah 8// dari sensor bateri
bool kePengecas=false;
bool pandu=false;
/////////////////////////////////////
int jarak_halangan=100;
void setup(){
pinMode(A1A,OUTPUT);
pinMode(A1B,OUTPUT);
pinMode(B1A,OUTPUT);
pinMode(B1B,OUTPUT);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
pinMode(bateriLemah, INPUT_PULLUP);
pinMode(bumberL, INPUT_PULLUP);
pinMode(bumberR, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(bumberL), bumper,FALLING );
attachInterrupt(digitalPinToInterrupt(bumberR), bumper,FALLING );
delay(3000);
servo_motor.attach(4); // pin servo
servo_motor.write(98);
Serial.begin(9600);
/////////////////////pengaturcaraan utama/////////////////////////
}
void loop(){
if (bateriLemah==0){
kePengecas=true; // terima msg untuk pulang ke pengecas
}
else{
pandu=true ;
}
if (kePengecas) pulangKePengecas();
if (pandu) panduDanMengelak();
}
/////////////////////tamat void loop///////////////////////////
/*///////////////////////////////////////////////
//MENGELAK HALANGAN//////////////////////////////
///////////////////////////////////////////////*/
void panduDanMengelak(){
int jarak_kanan=0;
int jarak_kiri=0;
delay(50);
jarak_halangan=jarak();
// jarak kurang dari 20 cm
if (jarak_halangan<=20){
henti();
delay(300);
belakang(200);
delay(400);
henti();
delay(300);
jarak_kanan = lihat_kanan();
jarak_kiri = lihat_kiri();
if (jarak_kanan >= jarak_kiri){
kanan(180);
delay(500);
henti();
}
else{
kiri(180);
delay(500);
henti();
}
jarak_halangan=jarak();
}
else {
depan(250);
jarak_halangan=jarak();
}
}
/*///////////////////////////////////////////////
// SERVO/////////////////////////////////////////
///////////////////////////////////////////////*/
// membaca jarak
int jarak(){
int durasi, jarak;
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
delayMicroseconds(2);
durasi = pulseIn(echo, HIGH);
jarak = durasi/58;
return jarak;
}
// servo pusing kanan 30 darjah untuk jarak halangan kanan
int lihat_kanan(){
servo_motor.write(30);
delay(500);
int lihat_kanan = jarak();
Serial.println(lihat_kanan);
servo_motor.write(98);
return lihat_kanan;
}
// servo pusing kiri 150 darjah untuk jarak halangan kiri
int lihat_kiri(){
servo_motor.write(150);
delay(500);
int lihat_kiri = jarak();
Serial.println(lihat_kiri);
servo_motor.write(98);
return lihat_kiri;
}
/*///////////////////////////////////////////////
//MOTOR//////////////////////////////////////////
///////////////////////////////////////////////*/
void depan(int laju){
analogWrite(A1A,laju);
analogWrite(A1B,0);
analogWrite(B1A,laju);
analogWrite(B1B,0);
}
void kanan(int laju){
analogWrite(A1A,0);
analogWrite(A1B,laju);
analogWrite(B1A,laju);
analogWrite(B1B,0);
}
void kiri(int laju){
analogWrite(A1A,laju);
analogWrite(A1B,0);
analogWrite(B1A,0);
analogWrite(B1B,laju);
}
void belakang(int laju){
analogWrite(A1A,0);
analogWrite(A1B,laju);
analogWrite(B1A,0);
analogWrite(B1B,laju);
}
void henti(){
analogWrite(A1A,0);
analogWrite(A1B,0);
analogWrite(B1A,0);
analogWrite(B1B,0);
}
/*///////////////////////////////////////////////
//KOMUNIKASI DENGAN PENGECAS/////////////////////
///////////////////////////////////////////////*/
bool terimaMsg() {
static char *cp = buffermsg;
bool idMatch = false;
if (!Serial.available()) {
return false;
}
if (Serial.available()) {
int thisid = (int)Serial.read();
if (thisid == myId) idMatch = true;
delay(4);
}
while (Serial.available()) {
*cp = (char)Serial.read();
delay(4);
if ((*cp == '\n') || (cp - buffermsg >= 10)) // end of message character or full buffer
{
*cp = 0; // end of string character
cp = buffermsg;
if (idMatch) strcpy(serialmsg, buffermsg);
return idMatch;
break;
}
else {
cp++;
}
}
}
void hantarMsg(int id, String message) {
Serial.write(id);
Serial.println(message);
}
void padamRxBuffer() {
char d;
while (Serial.available()) {
d = (char)Serial.read();
delay(3);
}
}
/*///////////////////////////////////////////////
//BALIK KE PENGECAS/////////////////////
///////////////////////////////////////////////*/
void pingPengecas() {
servo_motor.write(98);
digitalWrite(trig, HIGH);
delayMicroseconds(8);
digitalWrite(trig, LOW);
delay(7);
delay(200);
}
void pulangKePengecas() {
hantarMsg(201, "P1") ;
delay(50);
pingPengecas();
if(terimaMsg()){
if(serialmsg[0] == 'L' || serialmsg[0] == 'R'){
henti();
delay(1000);
depan(150);
delay(1000);
}
else {kanan(150);}
}
}
/*///////////////////////////////////////////////
// BUMPER////////////////////////////////////////
///////////////////////////////////////////////*/
void bumper() {
if (digitalRead(bumberL)==1 || digitalRead(bumberL)==1){
if(kePengecas)henti();
}
}
Bergerak kehadapan jika jawapan betul
#include <Stepper.h>
int steps=2048;
Stepper stepper(steps,9,11,10,12);// pin stepper but PIN9/IN1 PIN10/IN2 PIN11/IN3 PIN12/1IN4
int bz=8;// built in buzzer
int vibr=3;
char step_pos=0;//kedudukan stepper
void setup() {
stepper.setSpeed(15);//kelajuan stepper
Serial.begin(9600);// bluetooth
pinMode(bz,OUTPUT);// penggera
pinMode(vibr,INPUT);// penderia
}
void loop() {
//manual dari handphone
if(Serial.available() > 0)
{
step_pos= Serial.read();
switch(step_pos){
case '1': stepper.step(-steps/2);delay(500);break;// clockwise
case '2': stepper.step(steps/2);delay(500);break;// anti clockwise
case '3': stepper.step(-steps*2);delay(500);break;
case '4': stepper.step(steps*2);delay(500);break;
default: break;
}
}
//penggera
else{
long getaran=pulseIn (vibr, HIGH);
if(getaran>10000){
tone(bz,1000,3000);
}
}
}