Paso 3: Programar el Chip
Después de haber configurado el programador en el ultimo paso, cargar el bosquejo básico de Throwduino del IDE. Ha pegado por debajo y también adjunto.
Editar - puede haber un error en el código:umbral = (total >> 5); Ajuste el umbral a medio punto (dividir total de 128).
probablemente debe ser:
umbral = (total >> 7); Ajuste el umbral a medio punto (dividir total de 128).
Ha trabajado para mí como era pero esto podría causar problemas con el sensor de luz. Comprobar y corregir si es necesario.
Si desea cambiar la secuencia de destello de tu thowie ahora es el momento. Asegúrese de que su código quepan en la memoria del chip que tienes. No es probable que sea un problema para cualquier cosa más grande que un ATtiny25. El bosquejo a continuación lleva no mucho más que 1K. El código siguiente muestra el "1-4-3" conocida secuencia de destellos. Esto puede, por supuesto, no ser tuyo, tan lejos de hack.
La secuencia flash se lleva a cabo en la matriz y es simplemente una lista de números de flashes. Éstos se reproducirán con una breve pausa entre cada uno, seguidos de una pausa de 2 segundos antes de repetir. Por ejemplo, para:
Las fotorresistencias parpadeará una vez, pausa, flash 4 veces, pausa, flash 3 veces, pausa de 2 segundos y repita.
Una vez que el dibujo esté listo, seleccione ATtiny85 1Mz (o sea ATtiny) de la lista de tablas en el IDE. Si no selecciona la Junta correcta obtendrá un error de compilación (XXXX no definido en este ámbito). Si consigues esto, compruebe que ha seleccionado un ATtinyX5.
Golpe "upload" en el IDE. El Arduino Tiny utiliza el ISP de Arduino por defecto. Debería ver el pin13 condujo en su parpadeo de Arduino como se transfiere el dibujo.
¿Cómo funciona el bosquejo?
Tenemos unas funciones definidas que hacen cosas útiles y quizá quieras usar en hacking:
vacío flash(byte) - parpadea en los tiempos de "Bytes" de LED.
int lightLevel() - devuelve un int que contiene la medición de nivel de luz desde el LED contra el 2.56v interno ref.
vacío setup_watchdog(int) - establece el temporizador de vigilante en valor "int". 10 valores de 0 a 9 corresponden a 16, 32, 64, 128, 250, 500, 1000, 2000, 4000 y 8000 ms.
vacío system_sleep() - pone el sistema a dormir por el tiempo ajustado en la configuración del guardián.
Para empezar nos meter en unos registros para configurar cosas y minimizar el desperdicio de energía. Luego en configuración de flash 3 veces y mídase el nivel de luz de la 148. Desechar los primeros 20 y media los 128 restantes. Esto fija el umbral por el que nos juzgará cuando está oscuro. Nos flash el LED ese número de umbral antes de continuar. Esto es más para la depuración de lo útil.
En el bucle principal medir el nivel de luz y comparar el valor de umbral. Si su bajo valor entonces flash el LED por nuestro patrón preestablecido. Si el nivel de luz es alta entonces dormimos durante 8 segundos (la más larga que puede) antes de probar otra vez.
Mi agradecimiento a InsideGadgets por este artículo que formó el punto de partida para el código de sueño. Vale si lo que necesita para restablecer la bandera de interrupción habilitar cada vez que el WDT expira usas o el chip restablecerá la próxima vez.
Bosquejo (esto debería compilar alrededor 1262 bytes):
Throwduino básica
Esofagogastroduodenal 2012
Licencia MIT
Escrito en ATtiny25/45/85 usando Arduino Tiny core - http://code.google.com/p/arduino-tiny/
No compilará para otros Arduinos (ATMega168, ATMega328 etc.)
Asegúrese de que selecciona la Junta correcta antes de compilar.
Ref:
Pines del ADC:
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3
Si desea cambiar el patrón de iluminación, hazlo aquí.
valor por defecto es:
//
flashSeq byte const [3] = {1,4,3}; Patrón de iluminación
//
Esto da 1 flash, pausa, cuatro destellos, pausa, tres destellos, pausa.
Si desea una pausa más larga, utilice 0 para cada 500ms.
Después de la secuencia, esperamos 2s antes de repetir.
flashSeq byte const [3] = {1,4,3}; Patrón de iluminación. Editar esto.
Cuántas entradas en el patrón de iluminación.
const seqLength bytes = sizeof(flashSeq);
Ahora vamos a hacer un fotorresistencias para esa secuencia...
const int LEDpin = 4; Aunque esto está en una constante, hay un acceso directo del puerto
No trato de cambiar esto sin ir throu' el código entero.
umbral de unsigned int = 10; Esto instalaremos correctamente durante la instalación
Esto establece algunas librerías y definiciones para el uso con el temporizador para dormir
#include < avr/sleep.h >
#include < avr/wdt.h >
#ifndef cbi
#define cbi (sfr, bits) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
#ifndef OSE
#define OSE (sfr, bits) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
ISR(WDT_vect) {WDTCR| = B01000000;} / / reset Watchdog Timer al modo de interrupción de cada vez.
Metas con algunos registros para desactivar cosas y referencias.
void setup() {}
ADCSRB & = B10111111; desactivar comparitor
ACSR | = B10000000; Apague comparitor
ADCSRA | = B10000000; / / enciende ADC
DDRB & = B11100000; Set todo para entrada
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Set PB3 baja - esto era para la fase de prueba. Probablemente puede ser caído ahora.
PRR y = B11111110; claro ADC disable bit Reg de reducción de potencia
analogReference(6); 2.56v interno de referencia con sin bypass - INTERNAL2v56NB-
Mostrar que estamos despiertos:
Flash(3); Tres destellos - estamos ya en funcionamiento.
Establecer el umbral para la detección de luz durante los primeros 40 segundos.
Tomar 148 medidas, bin los primeros 20 y media entonces la siguiente 128.
unsigned int total = 0;
para (rep byte = 0; rep < 148; rep ++) {}
int value=lightLevel();
int valor = 10;
if(REP>19) {}
total += valor; tatke total de 128 lecturas
}
Flash(Value);
DDRB & = B11100000; Set todo para entrada
setup_watchdog(4);
system_sleep(); / / sueño de barrio segundo
DDRB| = B00011010; Establecer 1, 3 y 4 como salida
PORTB & = B1110000; Todo bajo
}
umbral = (total >> 7); Ajuste el umbral a medio punto (dividir total de 128).
Flash(THRESHOLD); Esto es principalmente para propósitos de depuración.
}
Bucle principal
Medimos el nivel de luz. Si es bajo entonces nos flash nuestra secuencia entonces sueño de 2s.
Si luz nivel alto, dormimos para 8s.
void loop() {}
analogReference(6); 2.56v interno de referencia con sin bypass
Medir el nivel de luz y si es lo suficientemente baja, mostrar nuestra secuencia flash
Si (lightLevel() < umbral) {}
para (secuencia de bytes = 0; secuencia < seqLength; secuencia ++)
Flash(flashSeq[Sequence]);
Si nosotros nos parpadea, ahora dormimos de 2s
DDRB & = B11100000; Set todo para entrada
setup_watchdog(7);
system_sleep(); / / sleep durante 2 segundos
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}
Else {}
Si nosotros no nos parpadea entonces dormimos para 8s
DDRB & = B11100000; Set todo para entrada
setup_watchdog(9);
system_sleep(); / / sleep durante 2 segundos
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}
} / / fin de bucle principal
Medir el nivel de luz mirando el voltaje generado por el LED conectado a D4 (A2) en pin 3 del chip.
Salida y bajo para comenzar a descargar cualquier tipo de carga - no estoy seguro si necesitamos esto
int lightLevel() {}
pinMode (LEDpin, salida);
digitalWrite (LEDpin, LOW);
delayMicroseconds(50);
pinMode (LEDpin, entrada);
delayMicroseconds(100); Deje que se estabilice como entrada otra vez
unsigned int valor = analogRead(A2);
devolver valor;
}
Flash rutina - 70ms, 250 ms off
Repetir cierto número de veces y luego pausa 500ms
void flash(byte No) {}
pinMode (LEDpin, salida);
if (!. No) {/ / si recibimos un cero, simplemente pausa.
DDRB & = B11100000; Set todo para entrada
setup_watchdog(5);
system_sleep(); / / sleep durante 500 ms
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}
Si tenemos un número distinto de cero de los flashes, les haremos ahora
para (rep byte = 0; rep < No; rep ++) {}
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
PORTB| = B00010000; PB4 alta
digitalWrite (LEDpin, alto);
Delay(70);
PORTB & = B11101111; PB4 baja.
DDRB & = B11100000; Set todo para entrada
digitalWrite(LEDpin,LOW);
setup_watchdog(4); WDT 3 = 128MS
system_sleep();
}
Pausa (sueño)
DDRB & = B11100000; Set todo para entrada
setup_watchdog(5); WDT 5 = 500MS
system_sleep(); / / dormir
DDRB| = B00011010; Set 1 y 3 como salida
PORTB & = B11110111; Pb3 baja.
}
Configuración del temporizador perro guardián
Esto es específico a ATTiny85 (+ tiny45 & tiny25) y no compila para ATMega328, etc..
0 = 16ms, 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250ms, 5 = 500ms
6 = 1 sec, 7 = 2 seg, 8 = 4 seg, 9 = 8 seg.
void setup_watchdog (int periodo) {}
valor del octeto;
Si período (período > 9) = 9;
valor = período & B111;
Si value| (período > 7) = (1 << 5);
Value| = (1 << WDCE);
MCUSR & = ~ (1 << WDRF);
Iniciar secuencia de tiempo de ciclo de reloj 4
WDTCR | = (1 << WDCE) | (1 << WDE);
definir el nuevo valor de tiempo de espera vigilante
WDTCR = valor;
WDTCR | = _BV(WDIE);
}
del sistema en el estado de sueño
sistema se despierta cuando está agotado wtchdog
void system_sleep() {}
CBI(ADCSRA,Aden); interruptor análogo a Digitalconverter
set_sleep_mode(SLEEP_MODE_PWR_DOWN); modo de reposo se encuentra aquí
sleep_enable();
sleep_mode(); Sistema duerme aquí
sleep_disable(); Sistema continúa ejecución aquí cuando agotado el tiempo de vigilancia
SBI(ADCSRA,Aden); interruptor analógico on Digitalconverter
PRR y = B11111110; claro ADC disable bit Reg de reducción de potencia
}