Código
- Código arduino Automatic_cat_feeder
Código arduino Automatic_cat_feeder C / C ++
Código-fonte do firmware Arduino. Fiz upload do código para a miniplaca Arduino pro com a ajuda do software Arduino IDE (https://www.arduino.cc/en/Main/Software) e um adaptador FTDI e um cabo USB Mini-B. Aqui está um vídeo sobre como fazer este processo:https://www.youtube.com/watch?v=78HCgaYsA70
O código é simples. Na configuração, ele irá girar o stepper do que no loop principal ele espera até que o botão seja pressionado, então ele se moverá novamente. // Alimentador automático de gatos feito por:J. Rundhall // Código original para steper de:Esboço de R. Jordan Kreindler, escrito em outubro de 2016, para rotatefloat RPM; boolean isButtonpressed =false; unsigned long timee; // Pin assignmentsint buttonPIN =6; int aPin =4; // IN1:bobina a um endint bPin =3; // IN2:bobina b um endint aPrimePin =5; // IN3:bobina aPrime outra extremidade da bobina aint bPrimePin =2; // IN4:bobina bPrime outra extremidade da bobina bint one =aPin; int two =bPin; int three =aPrimePin; int four =bPrimePin; int degrees =0; // int delay1 =20; // O atraso entre cada etapa em milissegundos delay1 =5; // O atraso entre cada etapa em milissegundos // int delay2 =50; // O atraso após cada revolução completa, em milissegundos delay2 =200; // O atraso após cada revolução completa, em milissegundos contagem =0; // O número de etapasint numberOfRotations =1; // O número de vezes que o rotor // girou 360 graus.void setup () {// Definir todos os pinos como saída para enviar sinais de saída do Arduino // UNO para os enrolamentos da bobina do statorSerial.begin (9600); // abre a porta serial, define a taxa de dados para 9600 bps pinMode (6, INPUT_PULLUP); // ButtonpinMode (aPin, OUTPUT); pinMode (bPin, OUTPUT); pinMode (aPrimePin, OUTPUT); pinMode (bPrimePin, OUTPUT); Serial.println ("Clockwise"); // Comece com todas as bobinas offdigitalWrite (aPin, LOW ); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); for (int ii =0; ii <20; ii ++) doTurn ();} void loop () {// ler o valor do botão em uma variável int sensorVal =digitalRead (6); // Lembre-se de que o pull-up significa que a lógica do botão está invertida. Ele vai // HIGH quando é aberto e LOW quando é pressionado. Ligue o pino 13 quando o // botão estiver pressionado e desligue-o quando não estiver:if (sensorVal ==LOW) {isButtonpressed =true; } else {if (isButtonpressed) {isButtonpressed =false; doTurn (); digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); }}} void doTurn () {// Enviar corrente para // 1. O aPin // 2. O aPin e o bPin // 3. O bPin // 4. Em seguida, para o bPin e o aPrimePin // 5. Depois, para aPrimePin // 6. Depois, para aPrimePin e bPrime Pin // 7. Depois, para bPrimePin // 8. Depois, para bPrimePin e aPin. // Produzindo assim as etapas usando o método de meia etapa // 1. Defina o aPin High digitalWrite (aPin, HIGH); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); // Permita algum atraso entre a energização das bobinas para permitir // o tempo de resposta do rotor de passo. atraso (atraso1); // Então, delay1 // 2. Energize aPin e bPin para HIGH digitalWrite (aPin, HIGH); digitalWrite (bPin, HIGH); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); // Permita algum atraso entre a energização das bobinas para permitir // o tempo de resposta do rotor de passo. atraso (atraso1); // Então, delay1 milissegundos // 3. Defina o bPin como High digitalWrite (aPin, LOW); digitalWrite (bPin, HIGH); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); // Permita algum atraso entre a energização das bobinas para permitir // o tempo de resposta do rotor de passo. atraso (atraso1); // Então, delay1 milissegundos // 4. Defina o bPin e o aPrimePin para HIGH digitalWrite (aPin, LOW); digitalWrite (bPin, HIGH); digitalWrite (aPrimePin, HIGH); digitalWrite (bPrimePin, LOW); // Permita algum atraso entre a energização das bobinas para permitir // o tempo de resposta do rotor de passo. atraso (atraso1); // Então, delay1 milissegundos // 5. Defina o Pin aPrime para alto digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, HIGH); digitalWrite (bPrimePin, LOW); // Permita algum atraso entre a energização das bobinas para permitir // o tempo de resposta do rotor de passo. atraso (atraso1); // Então, delay1 milissegundos // 6. Defina o aPrimePin e o Pin bPrime como HIGH digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, HIGH); digitalWrite (bPrimePin, HIGH); // Permita algum atraso entre a energização das bobinas para permitir // o tempo de resposta do rotor de passo. atraso (atraso1); // Então, delay1 milissegundos // 7. Defina o bPrimePin como HIGH digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, HIGH); // Permita algum atraso entre a energização das bobinas para permitir // o tempo de resposta do rotor de passo. atraso (atraso1); // Então, delay1 milissegundos // 8. Defina o bPrimePin e o aPin como HIGH digitalWrite (aPin, HIGH); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, HIGH); // Permita algum atraso entre a energização das bobinas para permitir // o tempo de resposta do rotor de passo. atraso (atraso1); // Então, delay1 milissegundos contagem =contagem + 8; graus =(360,0 * (contagem / 400,0)); if ((numberOfRotations% 2) ==1) {// Verifique se o número de rotações é par Serial.println ("Sentido horário"); Serial.println (graus); // Imprime a posição angular em graus} else {// Se numberOfRotations for um número ímpar Serial.println ("Anti-Clockwise"); graus =360 - graus; Serial.print ("-"); // Imprime um sinal de menos Serial.println (degrees); // Imprime a posição angular em graus} if (count ==160) {// Uma revolução completa do stepper numberOfRotations =++ numberOfRotations; tempo =milis (); RPM =timee / numberOfRotations; // Tempo médio de uma rotação RPM =(60000,00 / RPM); // Número de rotações por minuto if (numberOfRotations> =10) {Serial.print ("RPM:"); Serial.println (redondo (RPM)); // Imprimir RPM como inteiro} delay (delay2); // atraso2 / 1000 segundo (s) após cada rotação completa count =0; // Redefine o contador de passos para zero // Direção reversa após cada volta if ((numberOfRotations)% 2 ==0) {// Verifique se o número de rotações é par // se for assim, direção reversa aPin =four; bPin =três; aPrimePin =dois; bPrimePin =um; } else {// Se o número de rotações for um número ímpar aPin =um; bPin =dois; aPrimePin =três; bPrimePin =quatro; } digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); }}