Paso 5: El código, el alma
La parte más interesante, es donde todo el trabajo duro lo pagará. Hemos estado trabajando para cuidar todos los detalles físicos, ahora, ¿qué pasa con los emocionales? : p
Como un comienzo, usted necesitará tener el IDE de Arduino para su sistema operativo, entonces usted necesita instalar manualmente la biblioteca de Adafruit para poder controlar la NeoPixel en caso de que haya decidido utilizar.
Adjunto está el código completo de oiO a partir del momento que estoy escribiendo esto. Definitivamente recibirá más código y educación como ir :) Tenga en cuenta que el código está calibrado para trabajar con los sensores y servos que utiliza, así que tal vez no tiene sentido para usted cuando usted lo intenta. Usted tendrá que pasar por muchas pruebas hasta encontrar los buenos valores (más sobre esto en la siguiente sección)
Introducción
Para mí, la idea detrás de este proyecto es hacer oiO interactiva y autónoma, actuando por su cuenta. debe continuar su función principal, darle luz, pero también tiene su estado de ánimo y estado de ánimo, cambia de postura e interactúa con el usuario.
Pero había un reto para mí, resume en el siguiente puntos
1) Cómo puedo mover 3 servos a la vez o por separado si es necesario
2) como puedo facilitar los movimientos y presentar cierta flexibilización para simular un movimiento fluido. También tener algún control sobre la velocidad de servos para simular diferentes comportamientos.
3) Cómo puedo leer y controlar todos los sensores y servos en paralelo, sabiendo que Arduino nativamente no soporta multitarea.
4) Cómo puedo hacer creíble comportamiento de oiO y evitar respuestas robóticas para entradas análogas, como quiero que responden de manera diferente para la misma entrada (sonido y proximidad), todo este saber que Arduino solo lee el código de arriba a abajo y luego lazos
5) oiO debe tener un sentido del tiempo pasando por un acto según él.
Todo esto se hace con 32KB de memoria dinámica en el Arduino para el código y manteniendo simple!
Después de 2 días de escribir código, creo que he logrado mis metas y respondió a la pregunta cinco de forma aceptable con algunas concesiones.
Podríamos argumentar en qué tan bien lo hice y lo creíble es, pero final del día, el video que vi, es usando sólo el 17% de la memoria de código, y hay mucho espacio para mejoras, que voy a seguir a seguir. pero ya que tienes el código, por favor me escriba cualquier sugerencia o compartir las mejoras.
En siguientes secciones comparto algunos fragmentos de código que sentí necesario discutir, dejo a ustedes que están leyendo el código completo y hacer sentido de ella, también es fuertemente comentó para ayudar a comprender mejor y para mí recordar los detalles 3 meses a partir de ahora:). Espero que encima no lo hice!
Puntos 1 y 2
Mover 3 servos simultáneamente en Arduino no es posible nativamente. así que tuve que escribir una función que toma 3 servos y 3 posiciones de destino para cada uno, además de un factor de aceleración para controlar la velocidad y la facilidad de servos. Los controles de función los servos usando writeMicroseconds() en lugar de write(), como el anterior da un control más preciso debido a su amplia gama de valores, control de los servos ajuste el ancho de pulso PWM exacto en milisegundos, en lugar de este último grados angulares de los usuarios.
La función es:
- target_posX: tiene límites por inicio y fin de posiciones, entre los 600 y 2400 ms., algunos servos trabajan entre 1000 y 2000... por favor, consulte sus límites de servos por pruebas u hoja de datos antes de establecer los valores
-aceleración: es un valor entre 0.0 y 5.0, donde:
-valores entre 0.0 a 1.0 causa los servos para iniciar movimiento rápido pero terminan lento, valores alrededor de cero (ex: 0.05) da mucha respuesta lenta/deseado de alisar, el valor de 0.1 es lo suficientemente rápido como
-valores entre 1.0 y 5.0, no son considera flexibilización factores, ya que un cambio en el comportamiento, provocando servos para mover linealmente comienzan a parar x incrementos según el valor proporcionado. Valor de 2.0 es velocidad de tortuga, mientras que un valor de 5.0 es relativamente rápido.
Para simular el control simultáneo de 3 servos, el control de la función cada servo uno paso a la vez, pero en una fila, es decir, mueve servo1 un paso pequeño, entonces mueve servo 2 un paso pequeño, luego servo3 semejantemente, entonces hace otra vez y agin en un bucle hasta servos todos habían alcanzado sus posiciones de destino. El resultado final, servos todos parecen que han movido al mismo tiempo a sus posiciones de destino.
Puntos 3 y 4
Para hacer frente a esto, el truco era separar la lectura de los sensores valor de realmente actúan sobre los servos y los ojos. Esto me permite crear contadores que cuentan la sonido y consiguiente detección de proximidad, y también medir el tiempo entre las ocurrencias. Estos contadores y sellos de tiempo pueden utilizarse más adelante independientemente en la parte que actúan sobre los servos y los ojos. I prueba para los valores de contadores y ver cuánto tiempo tomó el usuario entre cada detección. Por ejemplo, se trata de cómo oiO puede distinguir entre un usuario aproximándose a él 3 veces de manera rápida, así haciendo oiO enojado con ojos rojos y movimientos espasmódicos o si el usuario se le acercó consecutivamente de manera lenta, por lo que oiO más tranquilo con más color de ojos y movimientos agraciados...
En Resumen, obtener sensores valor primero, luego actuar más tarde. pero puesto que el loop() Arduino está funcionando lo suficientemente rápido, el usuario no notará el retraso.
Punto 5
Desde el Arduino no está conectado a una fuente de tiempo externa, así puede saber el tiempo absoluto, así que oiO es utilizando la sincronización interna de Arduino usando la función millis() que cuenta el número de milisegundos desde el inicio/reinicio de Arduino. El contador vuelca después de aprox. 50 días, más que suficiente para el ciclo de vida de oiO. Esto debería ser suficiente para calcular por ejemplo: 15 minutos ha pasado así que no esta y eso, o ha sido 60 segundos el usuario no interactuar con oiO.
Por ejemplo, se trata de cómo oiO detecta que el usuario no interactuar con él desde 1 hora y por consiguiente comienza dormido, seguido de sueño profundo!
Control de los ojos
He utilizado la biblioteca de Adafruit ya que proporcionan funciones interesantes para controlar la NeoPixels, he agregado algunas funciones como setEyesColor() y dimmer() para tener fácil acceso a ajuste ambos colores de ojos y también controlan la atenuación en un color determinado con una determinada velocidad y dirección.
una: min brillo
b: máximo brillo
r, g, b: son los componentes de color RGB, cada uno puede tener un valor entre 0 y 255
fadeDirection: puede ser 1 = arriba, 2 = abajo, 3 = updown
stepSpeed, retardo en milisegundos entre el color se descolora pasos
Conclusión
Altamente recomiendo leer el código y entenderlo y modificarlo según sea necesario. Todas las variables en la fase de inicialización del código (es decir antes y dentro de la setup()) se debe fijar según sus necesidades.