torstai 11. elokuuta 2016

TankkiBotti - ensimmäisen version ohjelma ja kytkentäkaavio



Edellisessä artikkelissa kertoilin uudesta robottiprojektistani TankkiBotista (Nimi ehkä muutettava, alkaa ärsyttämään jo nyt :D). Kokeilin tänään minulle uutta ohjelmaa nimeltä Fritzing, jolla tein botin tämänhetkisestä tilasta kytkentäkaavion:


Fritzing on aika kätevä softa. Koska itsekin käytän prototyyppailussa kuvan kaltaista koekytkentälevyä, siirsin vain yhdistämäni piuhat ja piirit sellaisenaan digitaaliseen muotoon. Ohjelma tekee kytkennän perusteella (lähes) automaattisesti myös varsinaisen kytkentäkaavion ja jopa komponenttilistauksen.


Ja sitten vielä koodi:


  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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
//  Ultraäänisensorin määrittely (HC-SR04)
#include <NewPing.h>

#define TRIGGER_PIN   3
#define ECHO_PIN      4
#define MAX_DISTANCE  200

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

//  Moottorien & LEDien määrittely
int motor_left[] = {9, 10};
int motor_right[] = {11, 12};
int red = 5;
int green = 6;
int blue = 7;

int blink_rate = 200;
int blink_num = 5;

// Setup
void setup() {
  
  // Avaa sarjaportti
  Serial.begin(9600);
  
  // Alusta moottorien pinnit
  int i;
  for(i = 0; i < 2; i++){
    pinMode(motor_left[i], OUTPUT);
    pinMode(motor_right[i], OUTPUT);
  
  }

  // Alusta LEDien pinnit
  
  pinMode (red, OUTPUT);
  pinMode (green, OUTPUT);
  pinMode (blue, OUTPUT);

  // Ota satunnaislukujen alustusarvo analogisesta pinnistä 0 (ei kytketty)
  randomSeed(analogRead(0));
}

  

// Loop
void loop() { 

  // Määrittele ultraäänisensorin muuttujat tässä kontekstissa
  // ja hae etäisyys funktiolla
  
  int get_distance();
  int distance = get_distance();
  
  // Näytä sensorin etäisyysarvo sarjaportissa
  Serial.println(distance);

  // jos etäisyys on erisuuri kuin nolla ja pienempi kuin 50 cm, 
  // vilkuta LEDiä ja tee käännös satunnaiseen suuntaan.
  
  if (distance != 0)
  {
    if (distance < 50)
    {
      motor_stop();
      blink_white();
      random_turn();
    }
  }

  // Aja eteenpäin käännöksen jälkeen

  drive_forward();

}

//  Moottorien ohjaus

  void motor_stop(){
  digitalWrite(motor_left[0], LOW); 
  digitalWrite(motor_left[1], LOW); 
  
  digitalWrite(motor_right[0], LOW); 
  digitalWrite(motor_right[1], LOW);

  led_off();
  
  delay(25);
}

void drive_forward(){
  digitalWrite(motor_left[0], HIGH); 
  digitalWrite(motor_left[1], LOW); 
  
  digitalWrite(motor_right[0], HIGH); 
  digitalWrite(motor_right[1], LOW); 

  led_green();

}

void drive_backward(){
  digitalWrite(motor_left[0], LOW); 
  digitalWrite(motor_left[1], HIGH); 
  
  digitalWrite(motor_right[0], LOW); 
  digitalWrite(motor_right[1], HIGH); 

  led_red();

}

void turn_right(){
  digitalWrite(motor_left[0], LOW); 
  digitalWrite(motor_left[1], HIGH); 
  
  digitalWrite(motor_right[0], HIGH); 
  digitalWrite(motor_right[1], LOW);

  led_yellow();

}

void turn_left(){
  digitalWrite(motor_left[0], HIGH); 
  digitalWrite(motor_left[1], LOW); 
  
  digitalWrite(motor_right[0], LOW); 
  digitalWrite(motor_right[1], HIGH); 

  led_purple();
}

// Käännös satunnaiseen suuntaan

void random_turn() {
  long x = random(100);
  if (x < 50) {
    turn_left();
    delay(1000);
    motor_stop();
  } else {
    turn_right();
    delay(1000);
  }
  
}


//   LEDit

void blink_white() {
  for (int i = 0; i < blink_num; i++) {
    led_white();
    delay (blink_rate);
    led_off();
    delay (blink_rate);
  }
}

void led_red() {
  digitalWrite(red, HIGH);
  digitalWrite(blue, LOW);
  digitalWrite(green, LOW);
}

void led_blue() {
  digitalWrite(red, LOW);
  digitalWrite(blue, HIGH);
  digitalWrite(green, LOW);
}

void led_green() {
  digitalWrite(red, LOW);
  digitalWrite(blue, LOW);
  digitalWrite(green, HIGH);
}

void led_yellow() {
  digitalWrite(red, HIGH);
  digitalWrite(blue, LOW);
  digitalWrite(green, HIGH);
}

void led_purple() {
  digitalWrite(red, HIGH);
  digitalWrite(blue, HIGH);
  digitalWrite(green, LOW);
}

void led_white() {
  digitalWrite(red, HIGH);
  digitalWrite(blue, HIGH);
  digitalWrite(green, HIGH);
}

void led_off() {
  digitalWrite(red, LOW);
  digitalWrite(blue, LOW);
  digitalWrite(green, LOW);
}

//  Hae etäisyys ultraäänisensorilla

int get_distance() {
  delay(50);
  int distance = sonar.ping_cm();
  return distance;
}
  


Creative Commons -lisenssi
Tämä teos on lisensoitu Creative Commons Nimeä 4.0 Kansainvälinen -lisenssillä.

Ei kommentteja:

Lähetä kommentti