Viewmaster Diorama
Project overview
This guide enables you to create your own automated viewmaster with your own film using an Arduino and Processing.
The 'diorama'/ viewmaster will show you one of five photographs after ppushing the button. By pushing the button the disk will spin. Through the holes in between each picture the light sensor will detect light from the LED and will stop the motor and thus disk. This way you can see a different picture each time you press the button.
Don't forget to modify the ldrValue according to the light in the environment. You can test this feature and determine the values with the serial monitor on your computer.
Hardware
The Tinkercad circuit design and pictures show how I set up my hardware. You will see the folowing circuits: LED circuit, pushbutton circuit, light sensor circuit and finally the DC motor circuit. I used a small breadboard but I would recommend to use a bigger one so you have plenty of room in set up your circuits.
Software
//setup pins motor const int standBy = 10; const int PWMA = 3; const int AIN1 = 9; const int AIN2 = 8; //button const int buttonPin = 2; // the pin that the pushbutton is attached to // Variables will change: int buttonPushCounter = 0; // counter for the number of button presses int buttonState = 0; // current state of the button int lastButtonState = 0; // previous state of the button //sensor const int ldrPin = A0; int ldrValue; //led const int ledPin = 11; void setup() { pinMode(standBy, OUTPUT); pinMode(buttonPin, INPUT); //motor A pinMode(PWMA, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); Serial.begin(9600); } void loop() { //led digitalWrite(ledPin, HIGH); buttonState = digitalRead(buttonPin); ldrValue = analogRead(ldrPin); Serial.print("ldrvalue1 = "); Serial.println(ldrValue); // compare the buttonState to its previous state if (buttonState != lastButtonState) { // if the state has changed, increment the counter if (buttonState == HIGH) { // if the current state is HIGH then the button went from off to on: //derest van de code Serial.println("button pressed"); forward(50); delay(1000); while (ldrValue < 450) { Serial.println("while loop"); ldrValue = analogRead(ldrPin); Serial.print("ldrvalue2 = "); Serial.println(ldrValue); forward(100); delay(10); } Serial.println("stop"); stop(); } // Delay a little bit to avoid bouncing delay(50); } // save the current state as the last state, for next time through the loop lastButtonState = buttonState; } void forward(int spd) { runMotor(spd, 0); } void back(int spd) { runMotor(spd, 1); } void runMotor(int spd, int dir) { digitalWrite(standBy, HIGH); boolean dirPin1 = LOW; boolean dirPin2 = HIGH; if (dir == 1) { dirPin1 = HIGH; dirPin2 = LOW; } digitalWrite(AIN1, dirPin1); digitalWrite(AIN2, dirPin2); analogWrite(PWMA, spd); } void stop() { digitalWrite(standBy, LOW); }
Creating the Viewmaster
First I made a disk on which I placed five photographs. Then I cut a whole right across the picture on the disk. This way the picture will stop at the top. Next I carefully connected the motor to the center of the disk so the disk would turn evenly. After this I made a disk holder and a box to keep extra light from effecting the light sensor. Be sure to check your ldrValue according to the light in the environment! Finally I cut a whole to be able to press the button.
End Result
Enjoy :)