Arduino & Projects¶
Hoja de referencia para circuitos simples del arduino.
Arduino UNO¶
GRBL pins¶
https://github.com/gnea/grbl/wiki/Connecting-Grbl
Arduino reset from RPi GPIO¶
Nota: el GPIO no debe ser el 15, es solo de ejemplo.
El RESET pin del Arduino está alto por defecto (5V), y se resetea al bajarlo a GND (0V).
El GPIO del RPi está a solo 3.3V, entonces hay que poner un transistor en el medio.
- https://forum.arduino.cc/index.php?topic=640608.0
- https://crcit.net/c/39bad5d1050e4422931a430df44bfce1
Lo más fácil es usar un NPN como el 2N2222.
La resistencia puede ser de 10 kOhm segun el post. En otros posts usan solo 2kOhm.
Tachometer / Frequency meter¶
Hall sensor Tachometer¶
Hall sensor: proyectos/diy/componentes
En la versión más básica, el script detecta cuando la señal "sube" (y no cuando baja).
A este programa se le puede agregar lógica para que:
- Devuelva un valor de 0 RPM cuando el intervalo de tiempo sin pulsos supera algún umbral.
- Rechace subidas demasiado pegadas (ruido, en teoría).
Ver instrucciones en: https://www.instructables.com/RPM-Measurement-Using-Hall-Sensor-and-Arduino/
Usando interrputs¶
Otra forma es usar interrupts con las funciones que ya trae el Arduino IDE, ver:
attachInterrupt()
conmode=RISING
para emular el script anterior.- https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
AC Power line frequency meter¶
El concepto es el mismo, porque mide frecuencia.
En vez de un Hall sensor, se usa un rectificador y un optocoplador.
Antes de rectificar la fuente AC, hay que bajar la tension usando un par de resistores (de 30K en este circuito).
Después, la corriente rectificada entra al optocoplador (PC817 en este caso) activandolo dos veces por ciclo AC.
Finalmente el "zero crossing" de la onda rectificada es detectada a la salida del optocoplador por el arduino, usando attachInterrupt()
con mode=RISING
.
Es muy probable que el valor de las resistencias que usé sea clave para detectar bien el "zero crossing" en la línea AC. Si es demasiado alta, quizás el PC817 no se active en el momento preciso. Sin embargo, para medir la frecuencia alcanza.
El circuito de la foto se usa acá y uno similar se usa a continuación.
AC light dimmer¶
Detecta zero-crossing, y activa un Triac con cierto timing.
No tiene "snubber" porque el "load" es solo una lamparita (no es una carga inductiva).
https://circuitspedia.com/ac-dimmer-using-arduino/
Dimensiones de los pines¶
Burn bootloader¶
Se puede quemar el bootloader usando otro Arduino como programador.
Alguna vez probé esto: https://forum.arduino.cc/t/how-to-burning-bootloader-on-uno-via-mega-2560/597214/2
Entiendo que el capacitor puede ser importante. Quizás sea para que el MEGA no se reinicie durante el proceso (aunque no tengo idea de por qué lo haría).
Arduino MEGA 2560¶
GRBL pinout¶
Pinout acá: https://github.com/gnea/grbl-Mega/wiki/Connecting-Grbl-Mega
No es compatible con el CNC shield.
Osciladores¶
3 transistores¶
- sawtooth generator / oscillator https://www.youtube.com/watch?v=2a1I1X3RV0g
- Ring oscilator: https://www.youtube.com/watch?v=E94b7zugUDs
SIM800L¶
Tracker para la moto: https://www.youtube.com/watch?v=CeStrH-5Llo
https://gitlab.com/naikymen/simple_phone
GPS NEO6m¶
La library que mejor anduvo fue la de NeoGPS. Lo más difícil fue configurar los .h
y agregar el código para time zones. Por lejos, esta es la documentación más útil: https://github.com/SlashDevin/NeoGPS/blob/master/extras/doc/Data%20Model.md
SoftwareSerial también funcó.
Las otras fallaban por motivos que no entiendo del todo (overflow del serial buffer por ejemplo) y no pude solucionar.
Fuente con step-up¶
Para reemplazar este transfo de 13.5 V 500 mA (plug con positivo en el centro).
Servo¶
https://components101.com/motors/mg996r-servo-motor-datasheet
Hasta 6V
pigpio lo mueve bien entre 500 y 2500.
RC Snubber circuit¶
Sirve para proteger interruptores en circuitos con cargas inductivas (como motores eléctricos).
Explicaciones:
Como calcular los valores de R y C: https://youtu.be/wgNMepGIrTk?t=200
En el caso de corriente AC, el Triac reemplaza al "switch".
En este video hay un ejemplo comentado: https://www.youtube.com/watch?v=JrQdIjrT4XA
PID con TIP122 y PWM¶
/********************************************************************/
// First we include the libraries
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
/********************************************************************/
// Data wire is plugged into pin 4 on the Arduino
#define ONE_WIRE_BUS 4
#define PID_OUTPUT 11
/********************************************************************/
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
/********************************************************************/
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
/********************************************************************/
double Setpoint, Input, Output;
double Kp=2, Ki=5, Kd=1;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
void setup(void)
{
// start serial port
Serial.begin(9600);
//Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
Setpoint = 100;
myPID.SetMode(AUTOMATIC);
}
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
/********************************************************************/
//Serial.print(" Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperature readings
//Serial.println("DONE");
/********************************************************************/
//Serial.print("Temperature is: ");
Input = sensors.getTempCByIndex(0);
myPID.Compute();
analogWrite(PID_OUTPUT, Output);
Serial.println(Input); // Why "byIndex"?
// You can have more than one DS18B20 on the same bus.
// 0 refers to the first IC on the wire
// delay(1000);
}