Components and supplies
Development Board, Motor Control Shield
Photoelectric Sensor, Metal Barrel
Linear Solenoid, 12 VDC
Arduino Leonardo
Project description
Code
Code for PingHader
arduino
Code for PingHader
1/* 2This is a sketch written by XA & Bernhard Jordi 3for the sculpture "PingHader" 4www.bernhardjordi.ch 5*/ 6 7#include <Wire.h> 8#include <AccelStepper.h> 9#include <Adafruit_MotorShield.h> 10 11Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 12Adafruit_MotorShield AFMSbot(0x61); // Rightmost jumper closed 13Adafruit_MotorShield AFMStop(0x60); // Default address, no jumpers 14 15// Ausgabe anstellen? 16const bool DEBUG = true; 17 18int state = 0; 19unsigned long state_2_millis = 0; 20 21// Spicker: Select which 'port' M1, M2, M3 or M4 22Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1); // Anschluss M1 23Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2); // Anschluss M2 24 25 26// Spickknopf: Sensor (Knopf) bei Spickmotor 27const int BUTTON_SPICKMOTOR_PIN = A1; // 28const int BUTTON_SPICKMOTOR_PIN2 = A2; // 29 30// Druckknopf mit Licht 31const int LED_BUTTON_LED_PIN = 7; // Licht. 32const int LED_BUTTON_PRESSED_PIN = 4; // Knopf. 33// variables will change: 34int button_led_state = 0; // Variable für Lichtknopf 35int button_spickknopf_state = 0; // Variable für Spickerknopf 36int button_spickknopf_state2 = 0; // Variable für Spickerknopf2 37 38int maximale_anzahl_erfolgreiche_durchlaeufe; 39 40unsigned long debug_millis = 0; 41 42void setup() { 43 // set up Serial library at 9600 bps 44 if( DEBUG ) { 45 Serial.begin(9600); 46 } 47 // Sensor (Knopf) bei Spickmotor 48 pinMode(BUTTON_SPICKMOTOR_PIN, INPUT); 49 pinMode(BUTTON_SPICKMOTOR_PIN2, INPUT); 50 // Druckknopf mit abgestelltem Licht 51 pinMode(LED_BUTTON_LED_PIN, OUTPUT); 52 digitalWrite(LED_BUTTON_LED_PIN, LOW); // Kein Licht 53 pinMode(LED_BUTTON_PRESSED_PIN, INPUT); 54 // Zahnradmotor 55 AFMStop.begin(); // muss vo AFMS.begin() geshcehen !!!!! 56 // Spickmotor 57 AFMS.begin(); // create with the default frequency 1.6KHz. Muss nach AFMStop.begin() geschehen !!!!! 58 myMotor1->setSpeed(255); 59 myMotor1->run(RELEASE); 60 myMotor2->setSpeed(255); 61 myMotor2->run(RELEASE); 62 // Zufallsgenerator auf zufälligen Startwert 63 randomSeed(analogRead(0)); 64 debug_millis = millis(); 65} 66 67void loop() { 68 // Strom an -> 0 69 // Status 0: delay -> 1 70 71 // Status 2: Licht Startknopf anstellen -> 3 72 // Status 3: Warten auf Drücken des Startknopfs, Anzahl erfolgreiche Durchläufe festlegen, Licht Startknopf abstellen -> 4 73 74 // Status 5: Impuls Spickknopf gedrückt? -> 75 76 // Status 7: Spicken. -> 12 77 78 // Status 12: Wenn maximale Anzahl Durchläufe erreicht -> 2, sonst -> 5 79 80 // DEBUG: 81 if(DEBUG && (millis() - debug_millis > 1000)) { 82 myprint("..."); 83 debug_millis = millis(); 84 } 85 switch (state) { 86 case 2: 87 state_2(); 88 break; 89 case 3: 90 state_3(); 91 break; 92 case 5: 93 state_5(); 94 break; 95 case 7: 96 state_7(); 97 break; 98 case 8: 99 state_8(); 100 break; 101 case 12: 102 state_12(); 103 break; 104 default: // 0 105 state_0(); 106 break; 107 } 108} 109 110// Status 0: Spickmotor kurz an- und abstellen 111void state_0() { 112 // Spickmotor kurz an- und abstellen 113 delay(1000); 114 myprint("state0."); 115 state = 2; 116} 117 118// Status 2: Licht Startknopf anstellen 119void state_2() { 120 myprint( String("") + "Licht Startknopf anstellen"); 121 // Licht Startknopf anstellen 122 digitalWrite(LED_BUTTON_LED_PIN, HIGH); 123 state = 3; 124} 125 126// Status 3: Warten auf Drücken des Startknopfs, Anzahl erfolgreiche Durchläufe festlegen, Licht Startknopf abstellen -> 5 127void state_3() { 128 // Warten auf Drücken des Startknopfs 129 myprint("status3"); 130 button_led_state = digitalRead(LED_BUTTON_PRESSED_PIN); 131 if (button_led_state == HIGH) { 132 myprint("Startknopf wurde gedrueckt."); 133 maximale_anzahl_erfolgreiche_durchlaeufe = random(3, 23); 134 myprint(String() + "Anzahl Durchläufe zufaellig auf " + maximale_anzahl_erfolgreiche_durchlaeufe + " festgelegt"); 135 myprint("Stelle Licht Startknopf ab."); 136 // Licht Startknopf abstellen 137 digitalWrite(LED_BUTTON_LED_PIN, LOW); 138 delay(1000); 139 state = 5; 140 } 141} 142 143 144// Status 5: Impuls Spickknopf gedrückt? 145void state_5() { 146 // Wenn Spicksensor (Knopf) gedrückt 147 button_spickknopf_state = analogRead(BUTTON_SPICKMOTOR_PIN); 148 if (button_spickknopf_state >= 500) { 149 myprint("Spicksensor gibt an..."); 150 state = 7; 151 } 152 button_spickknopf_state2 = analogRead(BUTTON_SPICKMOTOR_PIN2); 153 if (button_spickknopf_state2 >= 500) { 154 myprint("Spicksensor2 gibt an..."); 155 state = 8; 156 return; 157 } 158} 159 160void state_7() { 161 delay(random(0, 5000)); 162 spicke(); 163 delay(500); 164 state = 12; 165} 166 167void state_8() { 168 delay(random(0, 5000)); 169 spicke2(); 170 delay(500); 171 state = 12; 172} 173 174// Status 12: Wenn maximale Anzahl Durchläufe erreicht -> 2, sonst -> 4 175void state_12() { 176 maximale_anzahl_erfolgreiche_durchlaeufe = maximale_anzahl_erfolgreiche_durchlaeufe - 1; 177 myprint(String() + "Noch " + maximale_anzahl_erfolgreiche_durchlaeufe + " Durchlaeufe..."); 178 if( maximale_anzahl_erfolgreiche_durchlaeufe == 0) { 179 state = 2; 180 } else { 181 state = 5; 182 } 183} 184 185// Hilfsfunktion. Spickmotor spickt. 186void spicke() { 187 // Spickmotor kurz an- und abstellen 188 myprint("Spickmotor spick!"); 189 myMotor1->run(FORWARD); // ON 190 delay(500); 191 myMotor1->run(RELEASE); // OFF 192} 193 194void spicke2() { 195 // Spickmotor kurz an- und abstellen 196 myprint("Spickmotor2 spick!"); 197 myMotor2->run(FORWARD); // ON 198 delay(500); 199 myMotor2->run(RELEASE); // OFF 200} 201 202void myprint(String text) { 203 if( DEBUG ) { 204 Serial.println(String("") + millis() + " ms, Status " + state + ": " + text); 205 } 206} 207
Downloadable files
Schematic for PingHader
Schematic for PingHader
Schematic for PingHader
Schematic for PingHader
Comments
Only logged in users can leave comments