Paso 6: Sketch de Arduino
He añadido ovejas originales de Ethan Dicks escultura boceto para este paso. Voy a añadir un archivo de croquis actualizados en una fecha posterior, cuando yo he terminado el diseño. Esto al menos que empieces con dos pañuelos de trabajo.
/ * ++ Ovejas, utilizan una combinación de RGB y LED IR y un fotosensor para imitar multitud reactiva comportamiento (emergente), este código va con el taller de la fábrica de fusibles "Hacer un inesperado comportamiento escultura con el Arduino" http://thefusefactory.org/2009/09/03/make-an-emergent-behavior-sculpture-with-the-arduino/ ya, o "ovejas", están un conjunto artístico de un kit Lilypad Pro (Lilypad base conectada a una unidad de alimentación de 5V Lilipad) tri-color LED montados sobre el MCU 328V en la placa Lilypad. Un grande Lilypad Protoboard se encuentra entre la fuente de alimentación y el Lilypad sí mismo para poder mantener resistencias y los componentes de IR. La ilusión de un quadraped se completa con 1W y 2W LEDs soldadas a la PSU "cuerpo" y doblaron como las piernas. El código depende de una variable persistente llamada "mood" - cuando es cero o cercano a cero, la oveja es "feliz". Por debajo de cero y las ovejas es "solitarias"; por encima de cero y el se siente oveja llena o agitado. Soledad está representada por el azul, la felicidad por verde y agitación por el rojo. Medio de expresar el "mood" (utilizando el PWM para RGB LED de la cortina), la parte principal del código comprueba pulsos IR de otras ovejas y puede emitir sus propios pulsos "llamar" a otras ovejas. Mediante la deformación variables internas, las ovejas pueden ser más o menos sensibles a las llamadas de otras ovejas. El comportamiento emergente se sale cuando varias ovejas se ensamblan y se coloca sobre una mesa, llamando a cada uno al otro. La ráfaga de pulsos IR puede inducir a la oveja para ser feliz o tal vez agitado. Pocos pulsos y las ovejas exhibe soledad. Sheep.PDE - convertir un Arduino en una escultura de comportamiento emergente Copyright (C) 2009, Ethan Dicks este programa es software libre: usted puede redistribuirlo y/o modificarlo bajo los términos de la GNU General Public License publicada por la Free Software Foundation, ya sea versión 3 de la licencia o (a su opción) cualquier versión posterior. Este programa se distribuye con la esperanza de que será útil, pero sin ninguna garantía; ni siquiera la garantía implícita de comerciabilidad o idoneidad para un propósito PARTICULAR. Consulte la GNU General Public License para más detalles. Usted debe han recibido una copia de la GNU General Public License con este programa. Si no, ver., * / / * ++ initialization Variable - antes del comienzo del código, poner todos los parámetros de usuario-ajustable en la parte superior para que sean fáciles de ajustar. --* / / / Definiciones de los valores de "humor" #define MOODMAX 80 #define MOODMIN (-1 * MOODMAX) #define solitario (MOODMIN) #define feliz (0) #define lleno (MOODMAX) #define MSTEPS 5 #define BLEAT_VOLUME 1 / / Global definiciones de asignaciones de pin (para simplificar las llamadas de función individual) int statusPin = 13; LED de estado de a bordo está conectado al pin digital 13int redPin = 11; Pétalo de R el módulo del RGB LED conectado al pin digital 11int greenPin = 9; Pétalo de G en el módulo del RGB LED conectado al pin digital 9int bluePin = 10; Pétalo de B en el módulo del RGB LED conectado al pin digital 10int sensorPin = 5; Fototransistor IR conectado al pin digital 5int Irpín = 6; IR LED conectado al pin digital 6 / / empezar esperando a ser Estado de ánimo feliz int = feliz; Seguimiento del sentido del ojo pinint entrada = 0; Y recuerda cómo "loud" Estamos "balido" (parpadeando los LED IR) int Balan = BLEAT_VOLUME; / * ++ setup() - el entorno de Arduino llama el código setup() una vez solamente, justo después de que la Junta se restablece. Poner código en esta función para inicializar I/O pins y tal - cosas que sólo necesitan hacerlo una vez durante una carrera. --* / voidsetup() {/ / para la depuración Serial.begin(9600); Serial.println ("ovejas v0.02"); En su mayoría, nuestros pins de I/O son salidas a LEDs pinMode (statusPin, salida); establece la statusPin a ser una salida pinMode (redPin, salida); establece la redPin ser una salida pinMode (greenPin, salida); establece la greenPin a ser una salida pinMode (bluePin, salida); establece la bluePin ser una salida pinMode (Irpín, salida); establece la Irpín ser una salida / una excepción es el IR phototransistor pinMode (sensorPin, entrada); establece la sensorPin a ser una entrada Serial.print ("ajuste IR ' balar' a"); Serial.println(bleat); analogWrite (Irpín, balonmano); } / * ++ loop() - el entorno de Arduino llame el código en este lazo para siempre. Poner cosas interesantes aquí que están destinadas a ejecutar indefinidamente después de setup() es llamada una vez. La única manera de salir de este bucle es restablecer la Junta. --* / voidloop() / / ejecutar una y otra vez {/ / Set nuestro LED RGB para reflejar el "estado de ánimo", que esperemos que va a cambiar de vez en vez de set_mood(mood); / / desacelerar lo rápido reaccionamos ante otras delay(100) 'oveja'; / retardo de.1 segundo / sensorPin tiene una resistencia de pullup de 10 K, así que * no * luz informa a 1. Necesitamos / / invertir el sentido lógico del pin si queremos pensar lógicamente de la luz / / 1-es-en/0-es-de ojo = 1 - digitalRead(sensorPin); valor ojo 1 si "vemos" cualquier IR luz / / Informe nuestro estado presente cada vez que a través del lazo Serial.print ("estado de ánimo es"); Serial.Print(MOOD); Serial.Print("
. Sensor es "); Serial.println(Eye); Si vemos pulsos de otra 'oveja', incrementar el estado de ánimo, pero no pasado MOODMAX si (ojo) {/ / puesto que los seres humanos no pueden "ver" la luz infrarroja, usar el LED como un indicador visible digitalWrite (statusPin, HIGH); / / eco detección entrada IR del estado LED mood += MSTEPS * 2; Si (humor > MOODMAX) {humor = MOODMAX;}} / / si no vemos ningún pulsos IR, disminuir el estado de ánimo, pero más abajo no MOODMIN {/ / ya que los seres humanos no pueden "ver" la luz infrarroja , usar el LED como un indicador visible digitalWrite (statusPin, bajo); Eco de la detección de entrada de IR en el estado de ánimo de LED = 1; Si (estado de ánimo < MOODMIN) {humor = MOODMIN;}} } / * ++ set_mood - convertir "ganas" de un esquema de color estado de ánimo varía de un número negativo a ese mismo valor como un número positivo (hasta -80 / + 80 y -100 / + 100 resultados razonables). Proporcionalmente, el continuo del estado de ánimo a los mapas de color similar a la siguiente: humor -100 + 100 0 -> Lonely feliz -> CrowdedR 0 0 0 30 100 G 0 30 100 0B 70 100 70 0 0 0--* / void set_mood (int mood) {/ / comenzar con cada color siendo off - ajustar hacia arriba basado en enrojecimiento de "mood" unsignedchar = 0; unsignedchar verdor = 0; unsignedchar azul = 0; #ifdef DEBUG Serial.print ("estado de ánimo es"); Serial.println(MOOD); #endif / azul es todo sobre el estado de ánimo siendo menos feliz entonces si (humor < feliz) {azul = abs(mood); verde = MOODMAX + estado de ánimo;} / enrojecimiento es todo acerca de ser Estado de ánimo más que feliz elseif (humor > HAPPY) {enrojecimiento = humor; verde = MOODMAX - humor;} / verdor es sobre humor siendo alrededor feliz otra {verdor = MOODMAX;} / / Set el LED para reflejar el color de nuestra estado de ánimo actual (enrojecimiento, verde, azul); } / * ++ conjunto de colores (r, g, b) - el tri-color LED en el color pedido valor usos analogWrite (pin, valor) para establecer valor PWM para cada color individual del LED el LED Tri-color es un dispositivo de ánodo común, para hacer luz, tierra el pin deseado. Para invertir la forma de onda PWM, disminuimos la intensidad deseada de 255, para que, por ejemplo, si queremos rojo, lógicamente, pasan alrededor de un valor de cero, sino que establecer el valor PWM a 255 para que el pin es conducido alto 100% del tiempo. Para obtener rojo para el máximo brillo, pasar alrededor de un valor lógico de 255, pero establezca el valor PWM en 0, tirando eso Perno baja 100% del tiempo--* / void color (unsignedchar roja, unsignedchar verde unsignedchar azul) / / el color función generatriz {#ifdef DEBUG Serial.print("color("); Serial.Print(red,HEX); Serial.Print(Blue,HEX); Serial.Print(Green,HEX); Serial.println(")"); #endif / / invertir el sentido del valor del PWM al llamar analogWrite() para cada color analogWrite (redPin, 255-rojo); analogWrite (bluePin, azul 255); analogWrite (greenPin, 255-verde); }