Skip to content

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.

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.

pigpio_arduinorst_npn.png

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/

20201228-185553.png

Usando interrputs

Otra forma es usar interrupts con las funciones que ya trae el Arduino IDE, ver:

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.

20201228-190724.png

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).

20201228-182833.png

https://circuitspedia.com/ac-dimmer-using-arduino/

Dimensiones de los pines

20200904-002900.png

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

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).

20210630-065929.png 20210630-065934.png

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

20201228-183034.png

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

20200630-142253.png

/********************************************************************/
// 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);


}