========= TTU Summer School programming ========= ====== Project 1 Controlling LED with button ====== {{:et:arduino:buttons:projekt1.jpg?350|Arduino ühendusskeem}} ===== Example #1.1 LED light up when button is pressed ===== Theory: [[https://www.arduino.cc/en/Tutorial/DigitalPins|]]. /* Example #1.1 */ /* Constants */ // Set button pin const int button = A0; // Set LED pin const int led = 13; /* Global variables */ // Holds the current state of button int buttonState = 0; void setup() { // Set LED pin to output pinMode(led, OUTPUT); // Set button pin to input with internal pull-up activated pinMode(button, INPUT_PULLUP); } void loop() { // Get the curren state of button pin buttonState = digitalRead(button); // If button is pressed then turn on LED if (buttonState == LOW) { digitalWrite(led, HIGH); } // All other cases turn LED off else { digitalWrite(led, LOW); } } ===== Example #1.2 Short push on the button makes LED light up for 1 second ===== /* Example #1.2 */ // Setup is same with example #1.1 const int button = A0; const int led = 13; int buttonState = 0; void setup() { pinMode(led, OUTPUT); pinMode(button, INPUT_PULLUP); } void loop() { // Get the curren state of button pin buttonState = digitalRead(button); // When button is pressed then set LED on and halt program for 1 second if (buttonState == LOW) { digitalWrite(led, HIGH); delay(1000); // 1000 millisekundit ehk 1 sekund } // Turn LED off digitalWrite(led, LOW); } ===== Example #1.3 Short push on the button changes LED state ===== /* Example #1.3 */ // Setup is same with example #1.1 const int button = A0; const int led = 13; int buttonState = 0; void setup() { pinMode(led, OUTPUT); pinMode(button, INPUT_PULLUP); } void loop() { // When button is pressed and hold the program stays inside while(1) loop if (digitalRead(button) == LOW) { // Debounce effect eliminator delay delay(50); while (digitalRead(button) == LOW) { } // Invert LED current state digitalWrite(led, !digitalRead(led)); // Debounce effect eliminator delay delay(50); } } ===== Exercises ===== === Exercise #1.1 === Modify example so that on button press LED blinks 3 times. === Exercise #1.2 === Modify example so that on button press LED starts to blink with constant interval. Second press ends the blinking. ====== Project 2 Controlling LED with potentiometer ====== {{:et:arduino:buttons:projekt2.jpg?400|}} ===== Example #2.1 Potentiometer controls state of LED ===== /* Example #2.1 */ // Set potentiometer pin const int pot = A1; // Set LED pin const int led = 13; // Holds potentiometer digital value int potState = 0; void setup() { // Set LED pin to output pinMode(led, OUTPUT); } void loop() { // Get digital value of potentiometer potState = digitalRead(pot); // When potentiometer digital value is logical "true" then turn on LED if(potState > 0) { digitalWrite(led, HIGH); } // All other cases set LED off else { digitalWrite(led, LOW); } } ===== Example #2.2 Controlling LED blinking frequency with potentiometer ===== /* Example #2.2 */ // Setup is same with example #2.1 const int pot = A1; const int led = 13; int potState = 0; void setup() { pinMode(led, OUTPUT); } void loop() { // Get analog value of potentiometer potState = analogRead(pot); // Turn LED on digitalWrite(led, HIGH); // Halt the program for potentiometer analog value number of milliseconds delay(potState); // Turn LED off digitalWrite(led, LOW); // Halt the program for potentiometer analog value number of milliseconds delay(potState); } ===== Example #2.3 Controlling LED brightness with potentiometer ===== /* Example #2.3 */ // Setup is same with example #2.1 const int pot = A1; const int led = 13; int potState = 0; void setup() { pinMode(led, OUTPUT); } void loop() { // Get analog value of potentiometer potState = analogRead(pot); // When potentiometer value is greater than 0 then set LED on halt program for short period if (potState > 0) { digitalWrite(led, HIGH); delayMicroseconds(potState); } // Turn LED off digitalWrite(led, LOW); // Halt program for short period delayMicroseconds(1023 - potState); } ===== Exercises ===== === Exercise #2.2 === Control LED on and off time with potentiometer. ====== Project 3 Alphabetical LCD ====== ===== Example #3.1 Writing on LCD screen ===== Theory: https://www.arduino.cc/en/Reference/LiquidCrystal /* Example #3.1 */ // Include LCD library #include // Create LCD object and set hardware connection pins LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { // Define LCD size lcd.begin(16, 2); // Print out welcome message lcd.print("Hello World!"); } void loop() { // Change cursor position to second line lcd.setCursor(0, 1); // Print out program working time in seconds lcd.print(millis()/1000); } ===== Example #3.2 Custom characters on LCD ===== /* Example #3.2 */ #include LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Array to generate new character, // "0b" in front of the number tells the compiler that it's a binary number byte customChar[8] = { 0b11111, 0b00000, 0b01010, 0b00000, 0b10001, 0b01110, 0b00000, 0b11111 }; void setup() { // Load new character to LCD memory position "0" lcd.createChar(0, customChar); // Define LCD size lcd.begin(16, 2); // Display new custom character on LCD lcd.write((uint8_t)0); } void loop() { // Do nothing } ===== Example #3.3 Reading LCD shield buttons ===== /* Nimetus: Example #3.3 Kirjeldus: Reading LCD shield buttons */ #include LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Define button states constants const int RIGHT = 0; const int UP = 1; const int DOWN = 2; const int LEFT = 3; const int SELECT = 4; const int NONE = 5; /* Global variables */ // Holds the value of pressed button int pressedButton; // Holds the value of analog input int buttonValue; void setup() { // Define LCD size lcd.begin(16, 2); // Print explaining text lcd.print("ADC: "); // Print out analog input value lcd.print(analogRead(A0)); } void loop() { // Calls out fucntion and saves returned value to variable pressedButton = checkButtons(); // Check if there is a pressed button if(pressedButton < NONE) { lcd.clear(); // Clear LCD lcd.print("ADC: "); // Print out explaining text lcd.print(buttonValue); // Print out analog input value delay(500); // Halts program for 500ms to get stable text on LCD } } // Function read analog input value and compares it with values of button states // Tagastab arvu vahemikus 0 kuni 5 vastavalt defineeritud konstandile int checkButtons() { // Get analog input value buttonValue = analogRead(A0); if (buttonValue < 50) return RIGHT; if (buttonValue < 195) return UP; if (buttonValue < 380) return DOWN; if (buttonValue < 555) return LEFT; if (buttonValue < 790) return SELECT; // If no button state matches then return NONE return NONE; } ===== Exercises ===== === Exercise #3.1 === Modify example so that text is center aligned. === Exercise #3.2 === Make a small animation with custom characters. Custom character code generator [[https://omerk.github.io/lcdchargen/|]] ====== Project 4 Reading sensors and displaying results on LCD ====== {{:et:arduino:sensorss:projekt4.jpg?800|}} ===== Example #4.2 Distance and proximity sensors reading ===== Libraries: [[https://www.arduino.cc/en/guide/libraries#toc4|]] /* Example #4.2 */ // Include libraries #include #include // Set pins for sensors const int US_TRIGGER = A2; const int US_ECHO = A3; const int IR = A4; /* Global variables and constants */ const int maxDistance = 200; int distance, proximity; // Create LCD object and define connection pins LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Create ultrasonic object and define connection pins NewPing sonar(US_TRIGGER, US_ECHO,maxDistance); void setup() { //Define LCD size lcd.begin(16, 2); // Print out explaining text lcd.print("Dist:"); lcd.setCursor(0, 1); lcd.print("Object:"); } void loop() { // Get distance in centimeters distance = sonar.ping_cm(); // Get proximity of object proximity = digitalRead(IR); // Set cursor to first line 10th character lcd.setCursor(9, 0); // EPrint out distance lcd.print(distance); // Overwrite previous value numbers with spaces lcd.print(" "); // Set cursor on second line 10th character lcd.setCursor(9, 1); // when infrared sensor does not see anything print out "no", otherwise print out "yes". if(proximity == 1) lcd.print("no "); else lcd.print("yes"); // Halt program to get stable view of LCD delay(500); } ===== Exercises ===== === Exercise #4.1 === Find out which sensor sample time is faster. ====== Project 5 DC motor drive and speed control ====== {{:et:arduino:motors:projekt5.jpg?700|}} ===== Example #5.1 DC motor ad H-bridge ===== /* Example #5.1 */ // Set pins for driver inputs const int left_A = 10; // driver pin A-1A const int left_B = 12; // driver pin A-1B const int right_A = 11; // driver pin B-1A const int right_B = 13; // driver pin B-2A void setup() { // Set driver control pins as output pinMode(left_A,OUTPUT); pinMode(left_B,OUTPUT); pinMode(right_A,OUTPUT); pinMode(right_B,OUTPUT); motors(0,0); // stop motors delay(2000); // halt program for safety purposes 2 seconds } void loop() { motors(1,1); // robot goes forward delay(2000); // halt program for 2 seconds motors(-1,1); // robot turns left delay(500); // halt program for 500 milliseconds } // This function controls the driver input pins to get correct motion void motors(int left, int right) { // Left Motor if(left == 1) { // Left motor CW digitalWrite(left_A,HIGH); digitalWrite(left_B,LOW); } else if(left == -1) { // Left motor CCW digitalWrite(left_A,LOW); digitalWrite(left_B,HIGH); } else { // Left motor STOP digitalWrite(left_A,LOW); digitalWrite(left_B,LOW); } // Right motor if(right == 1) { // Right motor CW digitalWrite(right_A,HIGH); digitalWrite(right_B,LOW); } else if(right == -1) { // Right motor CCW digitalWrite(right_A,LOW); digitalWrite(right_B,HIGH); } else { // Right motor STOP digitalWrite(right_A,LOW); digitalWrite(right_B,LOW); } } ===== Example #5.2 DC motor speed controlling ===== /* Nimetus: Example #5.2 */ // Set pins for driver inputs const int left_A = 10; // driver pin A-1A const int left_B = 12; // driver pin A-1B const int right_A = 11; // driver pin B-1A const int right_B = 13; // driver pin B-2B void setup() { // Set driver control pins as output pinMode(left_A,OUTPUT); pinMode(left_B,OUTPUT); pinMode(right_A,OUTPUT); pinMode(right_B,OUTPUT); motors(0,0); // Stop motors delay(2000); // Delay for safety purposes } void loop() { motors(100,100); // go fwd delay(2000); motors(100,255); // turn left delay(2000); motors(-255,-255); // go back delay(2000); motors(-255,-100); // go backward while turning right delay(2000); motors(150,-150); // turn on spot delay(2000); } // This function sets the motors speed and directions void motors(int left, int right) { // Left motor if(left > 0 && left <= 255) { // Left motor CW analogWrite(left_A,left); digitalWrite(left_B,LOW); } else if(left < 0 && left >= -255) { // Left motor CCW analogWrite(left_A, 255+left); digitalWrite(left_B,HIGH); } else { // Left motor STOP digitalWrite(left_A,LOW); digitalWrite(left_B,LOW); } // Right motor if(right > 0 && right <= 255) { // Right motor CW analogWrite(right_A,right); digitalWrite(right_B,LOW); } else if(right < 0 && right >= -255) { // Right motor CCW analogWrite(right_A,255+right); digitalWrite(right_B,HIGH); } else { // Right motor STOP digitalWrite(right_A,LOW); digitalWrite(right_B,LOW); } } ===== Exercises ===== ==== Exercise #5.1 ==== Modify exampe so that robot drives number eight shape. ==== Harjutus #5.2 ==== Make robot parallel park itself.