Goed idee met die stappenmotor van een matrix printer.
Kan dit ook worden uitgevoerd met een Arduino Uno ?
// ULN2803/4 controller board, Matsushita 42SIM-24D8YB/24D8A stepper motor// I/O pin1 = 4 rood ---> pin 4 stepper motor// I/O pin2 = 5 bruin ---> pin 2 ,,// I/O pin3 = 6 geel ---> pin 1 ,,// I/O pin4 = 7 blauw ---> pin 3 ,,// wit ---> pin 5 (VCC)// volgorde; 6 -> 6+5 -> 5 -> 5+7 -> 7 -> 7+4 -> 4 -> 4+6////--------------------- [global variables ]------------------------------------------------------const byte maxspoor = 6; // aantal sporenconst byte parkpause = 2; // minimum pause in msec = max. snelheidconst byte schuifpause = 1; // max. pause in msec = min. snelheidconst word stappenperspoor = 130; // aantal stappen tussen 6 sporen 0..5const word stappennaarnul = 30; // aantal stappen van parkeerpositie naar spoor 0char messVersie[]="Traverse 1.0 "; // 18 positiesbyte doelspoor; // 6 sporen, om doelspoor 0..5 aan te gevenbyte actspoor; // om actuele spoor aan te gevenbyte rotorpos[9]; // fases 00000000 .. 00001010byte index; // begin fasepositie na parkerenint stappen; // totaal te nemen stappen vooruit (+) of achteruit (-)bool parkstand; // om aan te geven of in parkeerstand of niet//// bit D76543210const byte LCDcls = B00000001; // clear LCDconst byte autoinc = B00000110; // Set Auto-Increment on// B00001100; // Display on/off control: Display on, cursor off, blink offconst byte cursoron = B00001110; // Turn On Cursorconst byte twoline4b5x8= B00101000; // Function Set: 4 bits, 2-Line Mode, 5x8 font// Function set B001LNF-- Sets interface data length (L), number of display lines (N), and character font (F). 37 ms// 1 : 8 bits, // 0 : 4 bits// 1 : 2 lines, // 0 : 1 line// 1 : 5 x 10 dots, // 0 : 5 x 8 dots// B00110100; // Function Set: 8-bit, 1 line, font 5x10const byte cursorleft = B00010000; // move cursor 1 pos to leftconst byte cursorright = B00010100; // move cursor 1 pos to right// B0001 S/C R/L — — // Cursor or display shift without changing DDRAM contents. 37 ms// 1 = Display shift// 0 = Cursor move// 1 = to the right// 0 = to the left// -----[ I/O pin definitions ]-------------------------------------------------const byte draaiswpin = A1; // invoer voor doelspoor 0..6const byte parkswpin = 5; // invoer parkeerschakelaar const byte stepB4pin = 10; // naar stappenmotor via ULN2003 pin B1..B4const byte stepB3pin = 11;const byte stepB2pin = 12;const byte stepB1pin = 13;//const byte BCDpinA = A3; // BCD naar 7 seg displayconst byte BCDpinB = A7;const byte BCDpinC = A6;const byte BCDpinD = A4;const byte lamptestpin = A5;const byte ledroodpin = 6; // naar rode led op lcdboardconst byte ledgroenpin = 4; // naar groene led op lcdboardconst byte LCDd4pin = A0; // naar LCD datapin D4const byte LCDd5pin = 9; // naar LCD datapin D5const byte LCDd6pin = 2; // naar LCD datapin D6const byte LCDd7pin = 8; // naar LCD datapin D7const byte ENpin = 7; // naar LCD pin 10 ENable read/writeconst byte RSpin = 3; // naar LCD pin 9 Register SELECT; 0 = Instructie, 1 = data/text //======================[ LCD subroutines ] ======================================================void ClearLCD() { SendInst (LCDcls); // Clear display}// ----------------------------------void SendInst(byte inst){ digitalWrite(RSpin,LOW); // Set instruction mode SendChar (inst); digitalWrite(RSpin,HIGH); // Back to text mode;} // SendInst // ----------------------------------void SendChar (byte kar){ digitalWrite(LCDd4pin,bitRead(kar,4)); // kar.HIGHNIB // Send High Nibble digitalWrite(LCDd5pin,bitRead(kar,5)); digitalWrite(LCDd6pin,bitRead(kar,6)); digitalWrite(LCDd7pin,bitRead(kar,7)); digitalWrite(ENpin,1); // puls op ENable, LCD neemt data over delayMicroseconds(5); digitalWrite(ENpin,0); // digitalWrite(LCDd4pin,bitRead(kar,0)); // kar.LOWNIB // Send Low Nibble digitalWrite(LCDd5pin,bitRead(kar,1)); digitalWrite(LCDd6pin,bitRead(kar,2)); digitalWrite(LCDd7pin,bitRead(kar,3)); digitalWrite(ENpin,1); // puls op ENable, LCD neemt data over delayMicroseconds(5); digitalWrite(ENpin,0); //delay(10);} // SendChar//----------------------------------------------------------------------------------void stepperstap(byte index) { // draai steppermotor 1 stap digitalWrite(stepB1pin,bitRead(rotorpos[index],0)); digitalWrite(stepB2pin,bitRead(rotorpos[index],1)); digitalWrite(stepB3pin,bitRead(rotorpos[index],2)); digitalWrite(stepB4pin,bitRead(rotorpos[index],3));} // stepperstap//----------------------------------------------------------------------------------void motorstop () { // maak steppermotor stroomloos, leds aan/uit stepperstap(0); digitalWrite (ledroodpin,LOW); // rode led uit digitalWrite (ledgroenpin,HIGH); // groene aan} // motorstop//----------------------------------------------------------------------------------void parkeer() { // draai langzaam terug naar positie 0 totdat schakelaar wordt ingedrukt char messPark1[15] = "Parkeren... "; char messPark2[15] = "Geparkeerd. "; digitalWrite (ledroodpin,HIGH); // rode led aan, groene uit digitalWrite (ledgroenpin,LOW); ClearLCD; delay(50); for (int t = 0; t<= 11; t++) { SendChar (messPark1[t]); } // laat "Parkeren... " boodschap zien index = 9; // begin ergens parkstand = digitalRead(parkswpin); // kijk naar eindschakelaar op traverse (= ook op LCD module) while (parkstand == false) { // zolang schakelaar niet ingedrukt index = index - 1; // draai linksom if (index < 1) {index = 8; }; // stepperstap(index); delay (parkpause); parkstand = digitalRead(parkswpin); // kijk naar eindschakelaar op traverse } // schakelaar ingedrukt in eindstand // schuif naar spoor 0 for (int t = 0; t == stappennaarnul; t++) { // 512 = 1 REV rotor shaft = 1/64 REV output shaft, half step index = index + 1; // positief, rechtsom if (index > 8) {index = 1; } // opnieuw beginnen als te groot stepperstap(index); // uitvoer naar stappenmotor via ULN2003 delay (schuifpause*2); // langere pauze = langzamer schuiven } motorstop; // motor stroomloos, leds aan/uit ClearLCD; for (int t = 0; t<= 13; t++) { SendChar (messPark2[t]); } // laat "Geparkeerd." boodschap zien actspoor = 0; // actuele stand van schuifbrug doelspoor = 0; delay (1000); // wacht om tekst te laten zien}//===================================================================================================int haalstappen (int steps){ //draaischakelaar geeft spoor aan, spoor 0 = parkeerstand char messWacht[8]= "Wacht: "; char messNaar[8] = " ---> ?"; char messSpoor[8]= "Spoor "; byte tmpspoor; tmpspoor = actspoor; do { // wachten tot schakelaar is ingedrukt, dan parkswpin == high doelspoor = map(analogRead(draaiswpin),0,1023,0,5); // kijk naar draaischakelaar if (tmpspoor != doelspoor) { // laat stand draaischakelaar zien op LCD en 7 seg als veranderd is tmpspoor = doelspoor; SendInst(cursorleft); // zet cursor 1 pos naar links SendChar(48 + doelspoor); // laat nieuwe 'naar' spoornr zien op LCD // digitalWrite(BCDpinA,!bitRead(doelspoor,0)); // laat doelspoor zien op 7 seg display, 'laag' ís aan digitalWrite(BCDpinB,!bitRead(doelspoor,1)); digitalWrite(BCDpinC,!bitRead(doelspoor,2)); digitalWrite(BCDpinD,!bitRead(doelspoor,3)); } } while (digitalRead(parkswpin) == LOW); // niets doen zolang schakelaar op LCD module niet is ingedrukt // if (doelspoor > maxspoor) { doelspoor = maxspoor; } //DEBUG CRSRXY, 1,2, BIN dipsw, " doelspoor = ", DEC doelspoor, " " steps = (doelspoor-actspoor) * stappenperspoor; // kan negatief zijn //DEBUG CRSRXY, 1,3, "haalstappen; spoor ", DEC actspoor, " --> ", DEC doelspoor, " stappen = ", SDEC steps," ", CR ClearLCD; for (int t = 0; t<=5; t++) { SendChar(messSpoor[t]); } //lookup t, ["Spoor "], char SendChar (48 + actspoor); // laat 'van' spoornr zien op LCD for (int t = 0; t<=5; t++) { SendChar(messNaar[t]); } //lookup t, [" ---> "], char SendChar (48 + doelspoor); // laat 'naar' spoornr zien op LCD return steps; // haalstappen}// =======================================================================================0void setup() { pinMode(draaiswpin,INPUT); // invoer draaischakelaar pinMode(parkswpin,INPUT); // invoer parkeerschakelaar = ook schakelaar op LCD module pinMode(stepB1pin,OUTPUT); // uitvoer naar stappenmotor via ULN2003 pinMode(stepB2pin,OUTPUT); pinMode(stepB3pin,OUTPUT); pinMode(stepB4pin,OUTPUT); pinMode(BCDpinA,OUTPUT); // BCD naar 7 seg display pinMode(BCDpinB,OUTPUT); pinMode(BCDpinC,OUTPUT); pinMode(BCDpinD,OUTPUT); pinMode(lamptestpin,OUTPUT); pinMode(RSpin,OUTPUT); // = LCD PIN 9 Register Select; 0 = Instructie, 1 = data/text pinMode(ENpin,OUTPUT); // = ENable read/write pinMode(LCDd4pin,OUTPUT); // LCD datapin d4 pinMode(LCDd5pin,OUTPUT); // LCD datapin d5 pinMode(LCDd6pin,OUTPUT); // LCD datapin d6 pinMode(LCDd7pin,OUTPUT); // LCD datapin d7 pinMode(ledroodpin,OUTPUT); // leds op lcdboard pinMode(ledgroenpin,OUTPUT); rotorpos[0] = B0000000; // 0 rotorpos[1] = B0000010; // 6 rotorpos[2] = B0000110; // 6+5 rotorpos[3] = B0000100; // 5 rotorpos[4] = B0000101; // 5+7 rotorpos[5] = B0000001; // 7 rotorpos[6] = B0001001; // 7+4 rotorpos[7] = B0001000; // 4 rotorpos[8] = B0001010; // 4+6 // ------------------ Initialize LCD ------------------------------- //LOW RW ' write mode //LOW RS ' instruction mode //LOW LCDDB4 ' Set To 4-bit Operation //HIGH LCDDB5 //LOW LCDDB6 //LOW LCDDB7 //PULSOUT EN,3 SendInst (twoline4b5x8); // %00101000 = 2-Line Mode, 4 bits, 5x8 font SendInst (cursoron); // %00001110 = Turn On Cursor SendInst (autoinc); // %00000110 = Set Auto-Increment on ClearLCD; // for (int t=0; t<=18; t++) {SendChar (messVersie[t]); } delay (3000); // laat versie zien lamptest; // 7 segment lamptest parkeer; // draai naar positie 0 totdat schakelaar wordt ingedrukt, dan naar spoor 0}// --------------------------------------------------------------------void lamptest(){ // lamptest; 7 segment alle leds aan char messLamptest[15] = "lamptest... "; for (int t=0; t<=15; t++) {SendChar (messLamptest[t]); } // /* t = 8; digitalWrite(BCDpinA,bitRead(t,0)); // laat '8' zien op 7 seg display digitalWrite(BCDpinB,bitRead(t,1)); digitalWrite(BCDpinC,bitRead(t,2)); digitalWrite(BCDpinD,bitRead(t,3)); */ digitalWrite(lamptestpin,0); // maak lamptestpin laag, '8' gaat aan delay (1000); // 1 seconde 7 segment lamptest digitalWrite(lamptestpin,1); // maak lamptestpin hoog}// --------------------------[ main ]-----------------------------------//void loop() { haalstappen (stappen); // aantal stappen aan de hand van spoornummer via draaischakelaar // motor gaat draaien digitalWrite (ledroodpin, HIGH); // rode leds aan digitalWrite (ledgroenpin,LOW); // groene led uit // for (int stap = 0; stap == abs(stappen); stap++) { // STEP (HFstep+1) // 512 = 1 REV rotor shaft = 1/64 REV output shaft, half step if (stappen > 0) { index = index + 1; } // positief, rechtsom else { index = index - 1; } // negatief, linksom if (index > 8) {index = 1; } // opnieuw beginnen van onder als te groot if (index < 1) {index = 8; } // opnieuw beginnen van boven als te klein stepperstap(index); // uitvoer naar stappenmotor via ULN2003 if ((stap < (stappenperspoor/4) ) || (stap > (abs(stappen)-stappenperspoor/4) )) { delay (schuifpause*2); // langzaam schuiven als dichtbij doelspoor } else { delay (schuifpause); // snel schuiven } } actspoor = doelspoor; // schuifbrug is verplaatst naar doelspoor if (doelspoor == 0) { parkeer(); } // opnieuw nulstand vaststellen motorstop; // steppermotor stroomloos, rode led uit, groen aan }// ======================================= [ einde prog ]==============================================================