Arduino visual
Ledjes
Arduino visual
Ledjes
Arduino visual
Potmeter and Led Matrix

Workshop Arduino

Introductie

In week twee ben ik begonnen aan Arduino. Arduino is een klein board met programmeerbare elektronica. Met de Arduino kan je verschillende componenten aansturen, zoals bijvoorbeeld ledlampjes of bepaalde sensoren. Door het softwareprogramma van Arduino te downloaden op je laptop, kan je de Arduino koppelen aan je laptop. Zo kan je er voor zorgen dat de code die je maakt op je laptop, wordt uitgevoerd door de Arduino. Alle opdrachten heb ik gefilmd en zijn op chronologische volgorde aan de linkerzijde van de pagina te bekijken. Bepaalde filmpjes hebben een extra ingesproken verduidelijking, zodat iedereen ongeveer kan begrijpen wat ik heb gedaan. Ook heb ik bij bepaalde opdrachten ook de code en tekst bijgevoegd, omdat deze opdrachten belangrijk waren om Arduino te begrijpen.

Blinking

Om te kijken of de Arduino werkt, ben ik begonnen met een voorbeeld vanuit Arduino zelf. Op het board zie je om de seconden het led label blinken. Nadat ik dit had gedaan ben ik een echt led-lichtje gaan toevoegen op het breadboard. Dit is een board waar je de componenten (tijdelijk) kan bouwen, zoals een ledlichtje.

Tijdens de les waren een aantal dingen naar voren gekomen die handig zijn om te weten. De stroom moet altijd naar ground toe en dat je altijd weerstand moet toevoegen om bijvoorbeeld het ledje te besparen, anders gaat deze kapot. Daarnaast geeft een ledje maar op een manier stroom en dat is van de lange poot naar de korte poot. Ik heb deze fout best vaak gemaakt, waardoor ik dacht dat de constructie niet werkte. Door het ledje dan om te draaien, loste ik bijna elke keer het probleem op.

Ik heb geoefend met de led sneller en minder snel te laten knipperen en dat de led langer uitstaat dan aan. Daarna heb ik het uitgebreid door met twee ledjes te oefenen. Eerst heb ik geoefend met de ledjes die blinken op hetzelfde moment, sneller knipperen, maar daarna ook dat ze om de beurt knipperen. Dit heb ik gedaan door de delay te verhogen of te verlagen en de functie digitalWrite() op high (led aan) of low (led uit) te zetten. Onderstaand de code van deze oefening.

Opdracht 3B

	void setup() {

		pinMode(13, OUTPUT);
		pinMode(12, OUTPUT);
	}

 
	void loop() {
		digitalWrite(13, HIGH);
		digitalWrite(12, LOW);
		delay(1000);                       
		digitalWrite(13, LOW);
		digitalWrite(12, HIGH);
			delay(300);                      
	}

			

Fade led

In plaats van de functie digitalWrite() te gebruiken, maak ik nu gebruik van de functie analogWrite(). Deze functie zorgt ervoor dat je de helderheid van de ledjes kan aanpassen, mits de jumper wires op de juiste pin zitten. Dit weet je als de pin naast het nummer een ~ teken heeft. 255 betekent dat er volledig stroom door het ledje stroomt, bij 0 stroomt er geen stroom door het ledje en bij 128 stroom de helft door het ledje heen. Zo kan je de ledjes om de beurt laten vervagen en oplichten. Zie de code voor de uitwerking.

Opdracht 4C

	int greenLedPin = 10;
	int yellowLedPin = 9;

	void setup() {
			pinMode(greenLedPin, OUTPUT);
			pinMode(yellowLedPin, OUTPUT);
	}

	void loop() {
			for (int brightness=0; brightness <256; brightness++){
		analogWrite(greenLedPin, brightness);
		analogWrite(yellowLedPin, 255-brightness);
		delay(10);
			}
	}

			

Potmeter

Een potmeter is een draaiknop waarmee je onder andere een ledje aan en uit kan zetten. De potmeter moet altijd aan een A0 pin zitten, verbonden zijn met de 5V pin en de GRD (ground) pin. De A0 pin zorgt dat de gegevens gelezen kunnen worden, 5V zorgt dat er 5 volt door de potmeter stroomt en gaat terug via de ground pin.

Opdracht 5

	int sensorValue = 0; 
	int sensorPin = A0;

	void setup() {
			pinMode(sensorPin, INPUT);
			Serial.begin(9600);
	}

	void loop() {
			sensorValue = analogRead(sensorPin); 
			
			Serial.println(sensorValue); 
			delay(200); 
	}

			

De bovenstaande code zorgt ervoor dat de gegevens worden doorgestuurd naar de serial monitor. Daarin kan je aflezen wat er vanaf het Arduino board wordt gestuurd naar de laptop. Als je dus aan de potmeter draait, zie je de waarden in de serial monitor veranderen. Deze waarden kunnnen ook gekoppeld worden aan de functie analogWrite(), waardoor de ledjes in en uit vagen als je aan de potmeter draait. De functie map() zorgt ervoor dat de sensorValue binnen een bepaald bereik blijft. Bekijk de onderstaande code om te zien wat ik heb gedaan.

Opdracht 6C

	float sensorValue = 0.0; 
	int sensorPin = A0; 

	int greenLedPin = 10;
	int yellowLedPin = 9;


	void setup() {
		pinMode(sensorPin, INPUT);
		Serial.begin(9600);
		pinMode(greenLedPin, OUTPUT);
		pinMode(yellowLedPin, OUTPUT);
	}

	void loop(){
	  sensorValue = analogRead(sensorPin);
	  sensorValue= map(sensorValue, 0, 1023, 0, 255); 

	  analogWrite(greenLedPin, sensorValue);
	  analogWrite(yellowLedPin, 255-sensorValue);

	  Serial.println(sensorValue); 
	  delay(20); 
	}
				
			

Led Matrix

In deze opdrachten ging ik werken met een led Matrix. Dit is een 8x8 led plaat waar je dingen op kunt tonen door bepaalde ledjes aan te roepen. Hiervoor moest je wel eerst een libary downloaden, namelijk ledControl. Zo kan je functies oproepen, zoal setLed(), setRow() of setColumn(). Ik heb een smiley toegevoegd die om de seconden lacht en een fronsend gezicht trekt. Onderstaand de code hoe ik dit heb gedaan.

Opdracht 7A

	#include "LedControl.h" /* 
	DIN connects to pin 12 
	CLK connects to pin 11 
	CS connects to pin 10 */ 
	LedControl lc = LedControl(12,11,10,1);  

	void setup() { 
		lc.shutdown(0,false);  
		lc.setIntensity(0,8);  
		lc.clearDisplay(0); 
	} 
	void loop(){ 
		lc.setRow(0,0,B00111100); 
		lc.setRow(0,1,B01000010); 
		lc.setRow(0,2,B10100101);  
		lc.setRow(0,3,B10000001); 
		lc.setRow(0,4,B10100101); 
		lc.setRow(0,5,B10011001); 
		lc.setRow(0,6,B01000010); 
		lc.setRow(0,7,B00111100); 
		delay(1000); 

		lc.setRow(0,0,B00111100); 
		lc.setRow(0,1,B01000010); 
		lc.setRow(0,2,B10100101); 
		lc.setRow(0,3,B10000001); 
		lc.setRow(0,4,B10011001); 
		lc.setRow(0,5,B10100101); 
		lc.setRow(0,6,B01000010); 
		lc.setRow(0,7,B00111100); 
		delay(1000); 
	}

			

Ook heb ik nog een 'D' gemaakt die ik met een potmeter in beeld kan laten komen. Zie het filmpje links op de pagina om dit te zien.

Control the led

Naast een potmeter zijn er ook nog andere sensoren, zoals een LDR sensor. Deze sensor meet de hoeveelheid licht, vergelijkbaar met een straatlicht die aangaat als het donker wordt. De code die deze sensor laat werken is bijna hetzelfde als die bij de potmeter, maar zonder de waarden moest ik zelf uitzoeken. Dit doe je door het meest lage en hoge getal te meten door je hand over de sensor te houden en zo het bereik te berekenen en dit in de functie map() toe te voegen. Zie de volledige code voor alle stappen.

Opdracht 8

	float sensorValue = 0.0; 
	int sensorPin = A0; 

	int greenLedPin = 10;
	int yellowLedPin = 9;


	void setup() {
		 pinMode(sensorPin, INPUT);
		 Serial.begin(9600);
		 pinMode(greenLedPin, OUTPUT);
		 pinMode(yellowLedPin, OUTPUT);
	}

	void loop() {
		  sensorValue = analogRead(sensorPin); 
		  sensorValue= map(sensorValue, 0, 750, 0, 255);
		  sensorValue=constrain(sensorValue, 0, 255); 

		  Serial.println(sensorValue); 

		  analogWrite(greenLedPin, sensorValue);
		  analogWrite(yellowLedPin, sensorValue);

		  delay(20); 
	}

			

Sound

Op het board kan je ook een speaker toevoegen, zodat je met code geluid kan maken. Met de functie tone() kan je verschillende tonen aanroepen en de looptijd aangeven. Ik heb een sirene gemaakt, waar de lage toon 120Hz is en de hoge toon 800Hz. Zie de code.

Opdracht 9C

	int speakerPin = 8;
	
	void setup() {
		pinMode(speakerPin, OUTPUT);
	}
	void loop() {
		tone(speakerPin, 220, 500); 
		delay(500); 
		tone(speakerPin, 800, 500); 
		delay(500); 
	} 

			

Sensing temperature

Naast de potmeter en de licht sensor heb je ook een NTC sensor. Deze sensor meet de temperatuur. Hoe dit werkt is terug te zien in het filmpje.

Distance

Ook heb je een Ultrasonic Proximity Sensor, een sensor dat de afstand kan meten. De Arduino zendt een signaal naar de sensor, de sensor zend een ultrasone puls uit en deze afstand wordt in cm berekent en doorgestuurd naar de serial monitor. Zo kan je ook zorgen dat je een ledje aan en uit kan doen, door je hand dichtbij en ver weg van de sensor te houden. Zie de code voor alle stappen die ik heb doorlopen.

Opdracht 11C

	const int echoPin = 6; 
	const int trigPin = 7; 
	int ledPin = 8;


	void setup() { 
		pinMode(echoPin, INPUT); 
		pinMode(trigPin, OUTPUT); 
		pinMode(ledPin, OUTPUT);
		Serial.begin(9600); 
	} 

	void loop() { 
		
		digitalWrite(trigPin, LOW); 
		delayMicroseconds(2); 
		digitalWrite(trigPin, HIGH); 
		delayMicroseconds(5); 
		digitalWrite(trigPin, LOW); 
		
		long duration = pulseIn(echoPin, HIGH);
		
		int cm = duration / 29 / 2; 
		Serial.print(cm); 

		if(cm<50){
			digitalWrite(ledPin, HIGH);
		}

		Else{
			digitalWrite(ledPin, LOW);
		}

		Delay(100);
	}

			

Arduino and Processing

Processing is een programma waarmee je interactieve ervaringen kan maken, zoals het maken van een vierkant of een rondje. Deze kan reageren op sensoren, zoals ik heb gedaan met de temperatuur sensor. Door deze aan te raken wordt het vierkantje groter en kleiner als ik hem loslaat. Zie de code voor hoe ik dit heb gedaan met een ellipse.

Opdracht 12D

	float sensorValue = 0; 
	int sensorPin = A0; 
	int redLedPin = 10;

	void setup() {
		Serial.begin(9600); 
		pinMode(sensorPin, INPUT); 
		pinMode(redLedPin, OUTPUT); 
	}

	void loop() {
		sensorValue = analogRead(sensorPin); 
		sensorValue = (sensorValue/1023)*255;  
		analogWrite(redLedPin, sensorValue);
		Serial.println(sensorValue); 
		delay(100); 
	}
			

processing code

	import processing.serial.*;
	Serial myPort;
	String sensorReading="";
	
	void setup() {
		size(400, 400);
		myPort = new Serial(this, Serial.list()[3], 9600); 
		myPort.bufferUntil('\n');
	}
	void draw() {
		background(255);
		fill(0);
		text("Sensor Reading: " + sensorReading, 20, 20);
		ellipse(width/2, height/2, float(sensorReading), float(sensorReading));
		//square(float(sensorReading), float(sensorReading), 200);
	}

	void serialEvent (Serial myPort) {
		sensorReading = myPort.readStringUntil('\n');
	}

			

Buttons

Je kan een ledje ook aan en uit zetten door een button toe te voegen. Op de website van Arduino staat precies uitgelegd hoe je deze button kan gebruiken. In de onderstaande code staat hoe de code werkt als je het ledje uit wil hebben als je op de button drukt.

Opdracht 13B

	
	const int buttonPin = 2;     
	const int ledPin =  13;      

	int buttonState = 0;  

	void setup() {
	  
	  pinMode(ledPin, OUTPUT);
	  pinMode(buttonPin, INPUT);
	}

	void loop() {
	  buttonState = digitalRead(buttonPin);

	  if (buttonState == LOW) {
	    // turn LED on:
	    digitalWrite(ledPin, HIGH);
	  } else {
	    // turn LED off:
	    digitalWrite(ledPin, LOW);
	  }
	}

			

Servomotor

Een Servomotor is een motor die op een aangegeven positie draait, wat voor aangegeven door bijvoorbeeld een Arduino. Door meerdere for loops met verschillende posities te maken kan je de motor laten bewegen of zelf dansen. Om de motor te controleren moet je wel een speciale library importeren. Zie de onderstaande code hoe ik dit heb gedaan en de motor heb laten dansen.

Opdracht 14B

	//import libary
	#include Servo.h

	Servo myServo; 
	int servoPin = 9; 
	int pos = 0;

	void setup() {
		myServo.attach(servoPin); 
	}

	void loop() {
		for(pos = 0; pos < 50; pos += 1.5){ 
		myServo.write(pos); 
		delay(5); // Wait 5ms
		}

		for(pos = 150; pos >= 1; pos -= 1){
		myServo.write(pos); 
		delay(10); // Wait 10ms
		}

		for(pos = 1; pos <= 150; pos += 1){
		myServo.write(pos); 
		delay(15); // Wait 15ms
		}

		for(pos = 150; pos <= 1; pos -= 1.5){
		myServo.write(pos); 
		delay(10); // Wait 10ms

		int sensorValue = analogRead(A0); 
		Serial.println(sensorValue);
		sensorValue = map(sensorValue, 0, 1000, 0, 7);

		delay(20);
		}
	}