-
Internet of cablecutting is getting real (at least a bit)
06/03/2017 at 13:25 • 0 commentsThe last days I was playing around with Autodesk Fusion 360, to improve the designe of my machine. You can see the result in the picture on top of the log. Currently I`m redesigning most of my 3D-printed parts, because I think small adjustments here can do a lot of diverence. An other part that will be changed, is the DC-motor. I found an other one that has twice the speed and almost the same strength.
My biggest success of the last weeks can be seen in the next picture.
A friend of mine and me finally managed it to programm the sketch for the ESP 8266. Don`t mind the crazy green colour, we were simply to lazy to adjust the hex code of the backgroundcolour. :D
Have a nice weekend and keep going your projects !!! :)
-
~new step in the right direction~
05/30/2017 at 20:09 • 0 commentsThe last weeks i didn't post that much but it were quite productive weeks. I updated my layout, send it to Seeed, bought the parts, programmed the ESP and designed a new version of the machine in Autodesk !! :)
The next days I will release new information !! :)
Have a nice week everyone !! :)
-
~finished PCB ~
04/22/2017 at 19:11 • 0 commentsThis week was really a successfull one !! :) i etched my PCB and even updated my basic construction !! :)
-
~pcb~
04/21/2017 at 20:38 • 0 commentsToday I etched my very first PCB and I think it's a good result for the first try :) I hope that everything works find !! :)
-
~ latenight routing ~
04/15/2017 at 20:04 • 0 commentsSo finally after hours of playing around with the layout, I`m pretty happy with my result.
All parts are now on the right place and even the solder-points seem to work this way.
Tell me if you are missing something !!!
Have a nice day Hackers & Makers !! :)
Fritzing-Layout:
Top of the PCB:
Bottem of the PCB:
-
~ updated version of my planed pcb~
04/14/2017 at 18:19 • 2 commentsAfter good advices from the communtity i spend some time to improve my designe. I hope it is a little bit better this time, but tell me if not.
[By the way orange is at the bottem and yellow is on the top of the PCB.]
Next week i go to a science-camp called ESFZ, in Erlangen, where I`m able to etch my PCB. Can`t wait to get this thing reality!!
Have a nice weekend !!! :)
-
~ready for etching?~
04/09/2017 at 10:08 • 3 commentsThis is the result of my first time I have done layouting. If you have any experiences with this it would be really great to share your knowledge with me!!
Have a nice day!!
-
~future of this project~
04/08/2017 at 13:43 • 0 commentsHere you can see the plan of the board I`m going to produce. Furthermore there will be a hardware-update and some addons.
-
~new lasercutted labels~
03/15/2017 at 11:31 • 0 comments -
New Source-Code
03/14/2017 at 20:57 • 0 commentsDown there you can see the new code i wrote.
/* Author: Christoph Kirschner Created: 14.03.2016 Description: Automatischer Kabelschneider */ #include <LiquidCrystal_I2C.h> #include <Stepper.h> #include <Wire.h> // Anzahl der Schritte, die für eine Umdrehung benötigt werden #define STEPS 400 int SPc = 18; // Spannungsgrenzwerte der ersten 5 Knöpfen int voltages[5][2] = {{1005, 1016}, {510, 520}, {90, 110}, {170, 185}, {930, 932}}; // Sorgt dafür, dass die Knöpfe nur jede Millisekunde ausgelesen werden unsigned long lastButtonReadTime = 0; // Zählt wie viele Millisekunden eine Spannungänderung anlag unsigned int changedVoltageTime = 0; // Letzte entprellte Eingangsspannung int lastButtonVoltage = 0; //letzter entprellter Eingangswert int lastButtonState1 = 0; //letzter entprellter Eingangswert int lastButtonState2 = 0; //letzter entprellter Eingangswert int lastButtonState3 = 0; //Zeit seit der letzten Entprellung int lastDebounceTime1 = 0; //Zeit seit der letzten Entprellung int lastDebounceTime2 = 0; //Zeit seit der letzten Entprellung int lastDebounceTime3 = 0; //Entprellzeit int debounceDelay = 50; //Positionierung beim Scrollen durch Menü int menuPosition = 1; int settingsPosition = 0; //Eingabemodus bool settings = false; //Werte der zu schneidenden Kabel int cableLength1 = 0; int cableLength2 = 0; int cableNumber1 = 0; int cableNumber2 = 0; int cableLength3 = 0; int cableLength4 = 0; int cableNumber3 = 0; int cableNumber4 = 0; // Zur Wahl von Kabellänge oder Stückzahl bool changeLength = true; // Kabellänge der zu schneidenden Kabel unsigned int cableLength = 0; // Stückzahl der zu schneidenden Kabel unsigned int cableNumber = 0; //Geschnittenen Kabel unsigned int alreadyCutted = 0; //Menü-Taster const int button1 = 2; // button1 - 3: Menüwahl-Taster; button1: Scrollen; button2: Wahl; button3: Zurück const int button2 = 3; const int button3 = 4; // Bibliotheken initializieren LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); Stepper stepper(STEPS, 6, 7, 8, 9); // Prädeklarationen void buttonReading(); void menuTasterAction(); void checkButton(int voltage); void pressButton(int buttonIndex); void startCutting(); bool isPliersCompressed(); bool isPliersOpen(); void cutt(); void lcdDisplay(unsigned int alreadyCutted); void lcdDisplaySettings(); /********************************************** Initializiere Bibliotheken und zeige Boot-Nachricht **********************************************/ void setup() { Serial.begin(9600); lcd.begin(16, 2); // Initialisiere LCD lcd.backlight(); //Input-Pins mit internem Pullup für Menü-Taster pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP); pinMode(button3, INPUT_PULLUP); // rpm des Steppermotors stepper.setSpeed(30); lcd.setCursor(0, 0); lcd.print("Welcome!"); delay(1000); // System is starting... lcd.clear(); lcd.setCursor(0, 0); lcd.print("System is"); lcd.setCursor(0, 1); lcd.print("starting..."); cutt(); // System is ready now! lcd.clear(); lcd.setCursor(0, 0); lcd.print("System is"); lcd.setCursor(0, 1); lcd.print("ready now!"); delay(2000); lcdDisplay(alreadyCutted); } /********************************************** Hauptloop mit Knopfentprellung **********************************************/ void loop() { int i; i = menuPosition; buttonReading(); if (menuPosition == 5) { lcdDisplaySettings(); } if (i != menuPosition) { lcdDisplay(alreadyCutted); } } void buttonReading () { lastButtonReadTime = millis(); if (lastButtonReadTime != millis()) { int voltage = analogRead(A0); int reading1 = digitalRead(button1); int reading2 = digitalRead(button2); int reading3 = digitalRead(button3); //Entprellen von Menü-Taster 1 if (reading1 != lastButtonState1) { lastDebounceTime1 = millis(); } if ((millis() - lastDebounceTime1) > debounceDelay) { if (reading1 == 0 && lastButtonState1 == !reading1 ) { Serial.println ("Scrollen+"); menuTasterAction (1); } } //Entprellen von Menü-Taster 2 if (reading2 != lastButtonState2) { lastDebounceTime2 = millis(); } if ((millis() - lastDebounceTime2) > debounceDelay) { if (reading2 == 0 && reading2 != lastButtonState2) { Serial.println ("Scrollen-"); menuTasterAction (2); } } //Entprellen von Menü-taster 3 if (reading3 == 0 && reading3 != lastButtonState3) { lastDebounceTime3 = millis(); } if ((millis() - lastDebounceTime3) > debounceDelay) { if (reading3 == 0 && reading3 != lastButtonState3 ) { Serial.println ("Auswählen/Menü"); menuTasterAction (3); } } //Abspeichern der Tasterzustände lastButtonState1 = reading1; lastButtonState2 = reading2; lastButtonState3 = reading3; // Zählt die ms, bei denen eine andere als die letzte Spannung analog if (voltage != lastButtonVoltage) { changedVoltageTime++; } else if (changedVoltageTime > 0) { changedVoltageTime--; } // Wenn die letzten 50ms eine andere Spannung als die letzte anlag if (changedVoltageTime >= 50) { changedVoltageTime = 0; lastButtonVoltage = voltage; if (voltage > 0) { checkButton(voltage); } } } } //Aktion bei Druck der Menü-Taster 1-3 void menuTasterAction (int action) { //Nach unten Scrollen if (action == 1) { if (menuPosition < 5) { menuPosition++; Serial.println(menuPosition); } } //Nach oben Scrollen if (action == 2) { if (menuPosition > 1) { menuPosition--; Serial.println(menuPosition); } } //Wahl des Eingabemodus if (action == 3) { settings = !settings; Serial.println (settings); } } /********************************************** Führt die entsprechende Aktion je nach Spannung aus **********************************************/ void checkButton(int voltage) { for (int i = 0; i < 5; i++) { // Voltage wird gegenüber min und max Grenzwert verglichen. if (voltage >= voltages[i][0] && voltage <= voltages[i][1]) { pressButton(i); lcdDisplay(alreadyCutted); return; } } } /********************************************** Aktion des entsprechenden Knopfes wird ausgeführt **********************************************/ void pressButton(int buttonIndex) { switch (buttonIndex) { case 0: if (settings = true ) { Serial.println("Kabellänge/Stückzahl"); changeLength = !changeLength; } break; case 1: if (menuPosition == 5 && settingsPosition == 3) { SPc++; Serial.println (SPc); break; } if (changeLength == true) { if (cableLength1 < 100 && menuPosition == 1) { cableLength1++; Serial.println("Length + 1"); break; } if (cableLength2 < 100 && menuPosition == 2) { cableLength2++; Serial.println("Length + 1"); break; } if (cableLength3 < 100 && menuPosition == 3) { cableLength3++; Serial.println("Length + 1"); break; } if (cableLength4 < 100 && menuPosition == 4) { cableLength4++; Serial.println("Length + 1"); break; } } if (changeLength == false) { if (cableNumber1 < 100 && menuPosition == 1) { if (menuPosition == 1) { cableNumber1++; Serial.println("Number + 1"); break; } } if (cableNumber2 < 100 && menuPosition == 2) { cableNumber2++; Serial.println("Number + 1"); break; } if (cableNumber3 < 100 && menuPosition == 3) { cableNumber3++; Serial.println("Number + 1"); break; } if (cableNumber4 < 100 && menuPosition == 4) { cableNumber4++; Serial.println("Number + 1"); break; } } break; case 2: if (menuPosition == 5 && settingsPosition == 3) { SPc--; Serial.println (SPc); break; } if (changeLength == true) { if (cableLength1 > 0 && menuPosition == 1) { cableLength1--; Serial.println("Length - 1"); break; } if (cableLength2 > 0 && menuPosition == 2) { cableLength2--; Serial.println("Length - 1"); break; } if (cableLength3 > 0 && menuPosition == 3) { cableLength3--; Serial.println("Length - 1"); break; } if (cableLength4 > 0 && menuPosition == 4) { cableLength4--; Serial.println("Length - 1"); break; } } if (changeLength == false) { if (cableNumber1 > 0 && menuPosition == 1) { if (menuPosition == 1) { cableNumber1--; Serial.println("Number - 1"); break; } } if (cableNumber2 > 0 && menuPosition == 2) { cableNumber2--; Serial.println("Number - 1"); break; } if (cableNumber3 > 0 && menuPosition == 3) { cableNumber3--; Serial.println("Number - 1"); break; } if (cableNumber4 > 0 && menuPosition == 4) { cableNumber4--; Serial.println("Number - 1"); break; } } break; case 3: Serial.println("Start"); startCutting(); break; case 4: Serial.println("Einzug"); stepper.step(50); cutt(); break; } } /********************************************** Schneide entsprechende Anzahl der Kabel mit entsprechender Länge ab **********************************************/ void startCutting() { lcd.noCursor(); menuPosition = 1; lcdDisplay(alreadyCutted); //Schneidevorgang für Einstellbereich 1 if (menuPosition == 1 && cableNumber1 != 0) { alreadyCutted = 0; lcdDisplay(alreadyCutted); while (alreadyCutted < cableNumber1 ) { stepper.step(cableLength1 * SPc); cutt(); alreadyCutted++; lcdDisplay(alreadyCutted); } if (cableNumber1 == alreadyCutted) { menuPosition++; alreadyCutted = 0; } } //Schneidevorgang für Einstellbereich 2 if (menuPosition == 2 && cableNumber2 != 0) { alreadyCutted = 0; lcdDisplay(alreadyCutted); while ( alreadyCutted < cableNumber2 ) { stepper.step(cableLength2 * SPc); cutt(); alreadyCutted++; lcdDisplay(alreadyCutted); } if (cableNumber2 == alreadyCutted) { menuPosition++; alreadyCutted = 0; } } //Schneidevorgang für Einstellbereich 3 if (menuPosition == 3 && cableNumber1 != 0) { alreadyCutted = 0; lcdDisplay(alreadyCutted); while (alreadyCutted < cableNumber3 ) { stepper.step(cableLength3 * SPc); cutt(); alreadyCutted++; lcdDisplay(alreadyCutted); } if (cableNumber3 == alreadyCutted) { menuPosition++; alreadyCutted = 0; } } //Schneidevorgang für Einstellbereich 4 if (menuPosition == 4 && cableNumber4 != 0) { alreadyCutted = 0; lcdDisplay(alreadyCutted); while ( alreadyCutted < cableNumber4 ) { stepper.step(cableLength4 * SPc); cutt(); alreadyCutted++; lcdDisplay(alreadyCutted); } if (cableNumber4 == alreadyCutted) { menuPosition = 1; alreadyCutted = 0; } } } /********************************************** Gibt an, ob die Zange zusammengezogen ist **********************************************/ bool isPliersCompressed() { delay(50); if (analogRead(A1) == 0 && analogRead(A2) != 0) { delay(30); return analogRead(A1) == 0 && analogRead(A2) != 0; } else { return false; } } /********************************************** Gibt an, ob die Zange ganz offen ist **********************************************/ bool isPliersOpen() { delay(50); if (analogRead(A2) == 0 && analogRead(A1) != 0) { delay(30); return analogRead(A2) == 0 && analogRead(A1) != 0; } else { return false; } } /********************************************** Mit der Zange einmal das Kabel abschneiden **********************************************/ void cutt() { // Zuziehen solange die Zange nicht ganz zusammengedrückt ist digitalWrite(13, HIGH); while (!isPliersCompressed()) { delay (20); } // Öffnen solange die Zange nicht ganz offen ist digitalWrite(13, LOW); delay(50); digitalWrite(10, HIGH); while (!isPliersOpen()) { delay(20); } if (isPliersOpen() == true) { digitalWrite(10, LOW); } delay(50); } void lcdDisplaySettings() { settingsPosition = 0; settings = false; buttonReading(); for (menuPosition == 5; settings != true; ) { buttonReading(); while ( settingsPosition == 0) { lcd.clear(); lcd.noCursor(); lcd.setCursor(0, 0); lcd.print ("Einstellungen"); settingsPosition++; } } for (menuPosition == 5; settings == true; settingsPosition != 3) { buttonReading(); while (settingsPosition == 1 ) { lcd.clear(); lcd.noCursor(); lcd.setCursor(0, 0); lcd.print ("SPc:"); lcd.setCursor(5, 0); lcd.print (SPc); settingsPosition++; } } for (menuPosition == 5; settings != true; settingsPosition != 1 ) { if (settingsPosition == 2) { settingsPosition++; lcd.clear(); lcd.noCursor(); lcd.setCursor(0, 0); lcd.print ("SPc:"); lcd.setCursor(5, 0); lcd.print (SPc); lcd.cursor(); lcd.setCursor(5, 0); } int SPcNew; SPcNew = SPc; buttonReading(); if (SPc != SPcNew) { lcd.clear(); lcd.noCursor(); lcd.setCursor(0, 0); lcd.print ("SPc:"); lcd.setCursor(5, 0); lcd.print (SPc); lcd.cursor(); lcd.setCursor(5, 0); } } menuPosition = 1; settingsPosition = 0; } /********************************************** Gibt die Länge, den Ist- und den Sollwert der Kabel am LCD aus. **********************************************/ void lcdDisplay(unsigned int alreadyCutted) { lcd.clear(); lcd.noCursor(); // Erste Zeile lcd.setCursor(0, 0); lcd.print("Kabell.:"); lcd.setCursor(9, 0); if (menuPosition == 1) { lcd.print(cableLength1); } if (menuPosition == 2) { lcd.print(cableLength2); } if (menuPosition == 3) { lcd.print(cableLength3); } if (menuPosition == 4) { lcd.print(cableLength4); } lcd.setCursor(12, 0); lcd.print("cm"); // Zweite Zeile lcd.setCursor(3, 1); lcd.print(alreadyCutted); lcd.setCursor(6, 1); lcd.print("/"); lcd.setCursor(9, 1); if (menuPosition == 1) { lcd.print(cableNumber1); } if (menuPosition == 2) { lcd.print(cableNumber2); } if (menuPosition == 3) { lcd.print(cableNumber3); } if (menuPosition == 4) { lcd.print(cableNumber4); } lcd.setCursor(13, 1); lcd.print(menuPosition); lcd.setCursor(14, 1); lcd.print("/4"); // Setzte den blinkenden Cursor auf den ausgewählten Wert // wenn gerade kein Schneidevorgang läuft if (alreadyCutted == 0 && settings == true) { lcd.cursor(); if (changeLength) { lcd.setCursor(9, 0); } else { lcd.setCursor(9, 1); } } }