-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmapping_with_radio_communication.ino
168 lines (131 loc) · 3.81 KB
/
mapping_with_radio_communication.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//radio comm
//https://howtomechatronics.com/tutorials/arduino/arduino-wireless-communication-nrf24l01-tutorial/
//https://makerfabs.com/Comunication?product_id=309
RF24 radio(48,49);// set pin CE, CSN
const byte address[6] = "00001";
//US Left
int trigPin2 = 3;
int echoPin2 = 2;
//US Right
int trigPin3 = 13;
int echoPin3 = 12;
//motors
int enA = 9;
int in1 = 8;
int in2 = 14;
int enB = 6;
int in4 = 7;
int in3;
void setup() {
//motors
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
Serial.begin(9600);// initialize serial communication of UltraSS
//Ultrasound
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(trigPin3, OUTPUT);
pinMode(echoPin3, INPUT);
//radio
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
//motion
void RunF(int limit) {// limit = speed
digitalWrite(in1, HIGH);//motor A at power 400, so moving
digitalWrite(in2, LOW);
analogWrite(enA, limit);
digitalWrite(in3, LOW);//motor B
digitalWrite(in4, HIGH);
analogWrite(enB, limit);
}
//Ultrasound
double UltraSSL() {//LEFT USS
long durationL;
int distanceL;
digitalWrite(trigPin2, LOW);// low signal to ensure clean high pulse
delay(1);
digitalWrite(trigPin2, HIGH);// set trig pin high
delayMicroseconds(10); // for 10 microsec, after this HIGH input, USS will send 8 small pulses
digitalWrite(trigPin2, LOW); // turn off
durationL = pulseIn(echoPin2, HIGH);
distanceL = durationL * 0.034 / 2;//distance in cm
return distanceL;
}
double UltraSSR() {//RIGHT USS
long durationR;
int distanceR;
digitalWrite(trigPin3, LOW);// low signal to ensure clean high pulse
delay(1);
digitalWrite(trigPin3, HIGH);// set trig pin high
delayMicroseconds(10); // for 10 microsec, after this HIGH input, USS will send 8 small pulses
digitalWrite(trigPin3, LOW);// turn off
durationR = pulseIn(echoPin3, HIGH);
distanceR = durationR * 0.034 / 2;//distance in cm
distanceR = 0 - distanceR; //invert to plot graph
return distanceR;
}
//sorting
void Array_sort(double *array , int n)
{
int i = 0 , j = 0 , temp = 0;
for (i = 0 ; i < n ; i++)
{
for (j = 0 ; j < n - 1 ; j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
// find median of array
float Find_median(double array[] , int n)
{
float median = 0;
// if number of elements are even
if (n % 2 == 0)
median = (array[(n - 1) / 2] + array[n / 2]) / 2.0;
// if number of elements are odd
else
median = array[n / 2];
return median;
}
void loop() {
int sample=10, plotL, plotR;
double L[sample], R[sample];
L[0] = UltraSSL();//initial reading
R[0] = UltraSSR();//
for (int i = 1; i < sample; i++) {
L[i] = UltraSSL();// read L distance
if (L[i] > 100) {//discard value if too large ~1m
L[i] = L[i-1];//copy last reading
}
R[i] = UltraSSR();// read R distance
if (R[i] > 100) {//discad value if too large ~1m
R[i] = R[i-1];//copy last reading
}
}
Array_sort(L, sample);// sort samples
plotL = Find_median(L, sample);//return median from samples
Array_sort(R, sample);// sort samples
plotR = Find_median(R , sample);//return median from samples
Serial.print(plotL); //plot L distance afer adjustments
Serial.print(" ");
Serial.println(plotR);// plot R distance afer adjustments
//send radio signal
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
//RunF(70);
}