Control de termistor de voltaje peltier con Arduino (para proyecto de caja de enfriamiento DSLR)


12

Estoy un poco familiarizado con la electrónica, principalmente por jugar con kits de electrónica cuando era niño. Sin embargo, eso fue hace mucho tiempo, quizás hasta hace 20 años. Actualmente estoy trabajando en una caja fría o "fría" para mi Canon 5D III, por lo que puedo mantener su temperatura muy baja y muy consistente para hacer astrofotografía de bajo ruido.

Tengo un diseño general para la caja, y estoy usando un solo peltier de 12v 5.8amp (TEC) conectado directamente a una caja de cobre para enfriar. Actualmente, la caja está aislada con una placa de espuma extruida, y la placa calefactora del peltier se enfriará con un enfriador de agua de un kit de computadora antiguo.

Sin embargo, me estoy volviendo más ambicioso con mi proyecto. Quiero regulación térmica, para mantener una temperatura constante, y eventualmente me gustaría entrar en un enfriamiento de dos etapas para lograr un Delta-T más cercano a -55-60 ° C en relación con el ambiente (la caja de enfriamiento enfriará el cámara, por lo que el sensor estará más caliente, probablemente hasta 10 ° C, que la temperatura del revestimiento de cobre en la caja.) Quiero tener dos modos principales:

  1. Modo de enfriamiento rápido, operando el peltier a 12v o más (el voltaje máximo es 15.4v) para enfriar rápidamente la caja hasta la temperatura objetivo.
  2. Modo de mantenimiento regulado, operando el peltier a voltajes más bajos para mantener una temperatura constante, por encima del enfriamiento potencial máximo que el peltier puede suministrar (para el espacio libre ya que el voltaje se ajusta en respuesta a pequeñas fluctuaciones de temperatura).

Me gustaría mantener la temperatura dentro de 2-3 ° C si es posible. He investigado a Arduino (y me he metido con cosas similares en el pasado), y parece perfectamente ideal para la tarea, con una excepción: no parece manejar el tipo de corriente que necesito la máxima potencia. más peltier, y ciertamente no dos.

Investigué un poco sobre cómo podría lograr esto, pero no estoy entendiendo bien la electrónica involucrada. He encontrado un "escudo" de dos relés para Arduino Uno que puede alimentar dos dispositivos con hasta 8 amperios cada uno y hasta 30 v cada uno. Eso se puede controlar desde el propio Arduino. Parece que el diseño de un relé utiliza una bobina magnética para accionar un interruptor que permite utilizar una fuente de alimentación independiente para alimentar componentes como un motor, un solenoide o, en mi caso, un peltier. Sin embargo, no he encontrado ninguna forma de regular el voltaje del relé con el Arduino.

Así que seguí investigando, y encontré algunos esquemas que mostraban cómo usar transistores, mosfets específicos para ser exactos, dónde estaba conectada la base a una salida Arduino, y el colector / emisor estaba conectado al circuito de alimentación de lo que fuera necesario. alimentado a un voltaje más alto (no estoy seguro acerca de la corriente aquí), y esto todavía permitió el control del voltaje.

Ha pasado mucho tiempo desde que me metí con alguno de estos componentes, mi memoria es extremadamente difícil y no estoy conectando del todo cómo funciona. Estaría contento con algunas referencias a ejemplos completos de alimentación y control del voltaje de dispositivos de alta potencia a través de un Arduino, pero si alguien aquí puede explicar cómo funciona todo esto y por qué, sería lo más ideal. Prefiero entender los conceptos, para poder volver a aplicarlos más tarde, que simplemente tener un patrón a seguir.


Estoy trabajando en un proyecto similar de enfriamiento de la cámara .
davidcary

Respuestas:


15

Buena pregunta, pero ha tocado varias cosas que requieren alguna explicación. La respuesta no es tan simple como probablemente esperaba si desea hacer esto bien. Hay una serie de problemas.

Por lo general, la potencia es modulada por PWM hoy en día. PWM significa modulación de ancho de pulso , y significa que alterna rápidamente entre cerrar y cerrar algo completamente. Si hace esto lo suficientemente rápido, el dispositivo que recibe la energía solo ve el promedio. Esto es tan común que la mayoría de los microcontroladores tienen generadores PWM integrados. Configura el hardware con un período específico, luego todo lo que tiene que hacer es escribir un nuevo valor en algún registro y el hardware cambia automáticamente el ciclo de trabajo, que es la fracción del tiempo que la salida está activada. Puede ejecutar un motor de CC con escobillas a unos 10 s de PWM Hz, y no puede distinguir la diferencia entre eso y la CC promedio. Para evitar que haga un sonido audible, puede ejecutarlo a 24 kHz PWM. Las fuentes de alimentación conmutadas funcionan en gran medida según este principio, y se ejecutan desde 10s de kHz a 100s de kHz bajo control del procesador, o más de un MHz desde un chip dedicado.

Una gran ventaja de conducir cosas con pulsos de encendido / apagado es que no se pierde energía en el interruptor. El interruptor no puede disipar ninguna potencia cuando está apagado, ya que la corriente a través de él es 0, o cuando está encendido, ya que el voltaje a través de él es 0. Los transistores son muy buenos interruptores para esto, y solo disiparán la energía mientras están en transición entre el encendido y fuera de los estados. Uno de los límites superiores de la frecuencia PWM es asegurarse de que el interruptor pase la mayor parte del tiempo completamente encendido o apagado y no mucho tiempo en el medio.

Puede pensar que esto suena fácil. Simplemente conecte el tipo correcto de transistor como un interruptor para impulsar la energía al Peltier, y conduzca desde la salida PWM inevitable que tiene su microcontrolador. Desafortunadamente, no es tan fácil debido a cómo funciona Peltiers.

El poder de enfriamiento de un Peltier es proporcional a la corriente. Sin embargo, el Peltier también tiene cierta resistencia interna que se calienta debido a la corriente. El calor disipado por una resistencia es proporcional al cuadrado de la corriente. Ambos efectos compiten en un refrigerador Peltier. Dado que el calentamiento interno va con el cuadrado de la corriente, pero la potencia de enfriamiento es solo proporcional a la corriente, eventualmente hay un punto en el que la corriente adicional causa más calentamiento del que puede eliminar el enfriamiento adicional. Esa es la corriente de enfriamiento máxima, que es algo que el fabricante debería decirte por adelantado.

Ahora probablemente esté pensando, OK, PWM entre 0 y esa corriente de enfriamiento (o voltaje) máxima. Pero, todavía no es tan simple por dos razones. Primero, el punto de enfriamiento máximo es también el punto menos eficiente (suponiendo que sea lo suficientemente inteligente como para no ejecutarlo más alto que el punto de enfriamiento máximo). Pulsar en ese punto daría como resultado el mayor consumo de energía para la cantidad de enfriamiento, lo que también significa la mayor cantidad de calor para eliminar la cantidad de enfriamiento. Segundo, los grandes ciclos térmicos son malos para Peltiers. Toda esa contracción diferencial y expansión eventualmente rompe algo.

Por lo tanto, desea ejecutar un Peltier a un voltaje o corriente suave y agradable, que varía solo lentamente para responder a las demandas de temperatura. Eso funciona bien para el Peltier, pero ahora tiene un problema en la electrónica de conducción. La buena idea de un interruptor de encendido completo o apagado total que no disipe ninguna potencia ya no se aplica.

Pero espera, todavía puede. Solo tiene que insertar algo que suavice los pulsos de encendido / apagado antes de que Peltier los vea. De hecho, esto es básicamente lo que hacen las fuentes de alimentación conmutadas. Todo lo anterior fue una forma de presentar la solución, que sentí que no habría tenido ningún sentido sin los antecedentes. Aquí hay un posible circuito:

Esto parece más complicado de lo que es porque hay dos conmutadores controlados por PWM allí. Explicaré por qué en breve, pero por ahora solo finja que D2, L2 y Q2 no existen.

Este tipo particular de FET de canal N puede accionarse directamente desde un pin del microcontrolador, lo que hace que la electrónica de conducción sea mucho más simple. Siempre que la puerta está alta, se enciende el FET, que corta el extremo inferior de L1 al suelo. Esto acumula algo de corriente a través de L1. Cuando el FET se apaga nuevamente, esta corriente continúa fluyendo (aunque disminuirá con el tiempo) a través de D1. Como D1 está vinculado al suministro, el extremo inferior de L1 será un poco más alto que el voltaje de suministro en ese momento. El efecto general es que el extremo inferior de L1 se cambia entre 0 V y la tensión de alimentación. El ciclo de trabajo de la señal PWM en la puerta de Q1 determina el tiempo relativo pasado bajo y alto. Cuanto mayor sea el ciclo de trabajo, mayor será la fracción del tiempo que L1 es conducido a tierra.

OK, eso es solo PWM básico a través de un interruptor de encendido. Sin embargo, tenga en cuenta que esto no está directamente relacionado con el Peltier. L1 y C1 forman un filtro de paso bajo. Si la frecuencia PWM es lo suficientemente rápida, entonces muy poca señal de pico a pico de 0-12 V en la parte inferior de L1 llega a la parte superior de L1. Y, hacer que la frecuencia PWM sea lo suficientemente rápida es precisamente lo que planeamos hacer. Probablemente ejecutaría esto al menos a 100 kHz, tal vez un poco más. Afortunadamente, eso no es realmente difícil para muchos microcontroladores modernos con su hardware PWM incorporado.

Ahora es el momento de explicar por qué Q1, L1 y D1 están duplicados. La razón es una capacidad más actual sin tener que obtener diferentes tipos de piezas. También hay un beneficio adicional en que la frecuencia PWM L1 y L2 junto con C1 tienen que filtrar es el doble de lo que se acciona con cada interruptor. Cuanto mayor sea la frecuencia, más fácil será filtrar y dejar solo el promedio.

Quieres casi 6 A de corriente. Ciertamente, hay FET e inductores disponibles que pueden manejar eso. Sin embargo, los tipos de FET que se manejan fácilmente directamente desde un pin del procesador tienen algunas compensaciones internas que generalmente no permiten una corriente tan alta. En este caso, pensé que valía la pena la simplicidad de poder conducir dos FET directamente desde los pines del procesador que minimizar el recuento absoluto de piezas. Un FET más grande con un chip controlador de puerta probablemente no le ahorrará dinero en comparación con dos de los FET que muestro, y los inductores también serán más fáciles de encontrar. Coilcraft RFS1317-104KL es un buen candidato, por ejemplo.

Tenga en cuenta que las dos puertas se accionan con señales PWM desfasadas 180 ° entre sí. La capacidad de hacerlo fácilmente en hardware no es tan común como solo los generadores PWM, pero todavía hay muchos microcontroladores que pueden hacerlo. En un apuro, puede conducirlos a ambos desde la misma señal PWM, pero luego pierde la ventaja de la frecuencia PWM que necesita el filtro de paso bajo para deshacerse del doble de cada una de las señales PWM individuales. Ambas mitades del circuito exigirán corriente de la fuente de alimentación al mismo tiempo también.

No tiene que preocuparse exactamente de qué voltaje o corriente resulta en el Peltier de cualquier ciclo de trabajo PWM, aunque averiguaría qué resulta en el punto de enfriamiento máximo y nunca establecería el ciclo de trabajo más alto que eso en el firmware. Si el voltaje de suministro es el punto de enfriamiento máximo, entonces no tiene que preocuparse por eso y puede llegar hasta el 100% del ciclo de trabajo.

En el siguiente nivel por encima del ciclo de trabajo PWM en el firmware, necesitará un bucle de control. Si se hace correctamente, esto impulsará automáticamente el enfriador al principio y luego retrocederá a medida que la temperatura se acerque al punto de ajuste. Hay muchos esquemas de control. Probablemente deberías buscar PID (Proporcional, Integral, Derivado), no porque sea el mejor o el más óptimo, sino porque debería funcionar lo suficientemente bien y hay una gran cantidad de información disponible.

Hay mucho más para entrar aquí, y ajustar los parámetros PID podría ser un libro completo por sí solo, pero esto ya se está volviendo muy largo para una respuesta, así que me detendré. Haga más preguntas para obtener más detalles.

Filtrar valores de pieza

La mayoría de las veces saqué los valores del inductor y del condensador del aire, pero según la intuición y la experiencia de que estos valores serían lo suficientemente buenos. Para aquellos que no están acostumbrados a estas cosas, aquí hay un análisis detallado que muestra que la onda PWM está realmente atenuada al olvido. En realidad, solo reducirlo a un pequeño porcentaje del promedio de DC sería lo suficientemente bueno, pero en este caso se reducen claramente a niveles muy inferiores a los que serían importantes.

Hay varias formas de ver un filtro LC. Una forma es pensar en las dos partes como un divisor de voltaje, y la impedancia de cada parte depende de la frecuencia. Otra forma es encontrar la frecuencia de caída del filtro de paso bajo y ver cuántas veces más alta es la frecuencia que estamos tratando de atenuar. Ambos métodos deberían dar como resultado la misma conclusión.

La magnitud de la impedancia de un condensador y un inductor son:

Z cap = 1 / ωC
Z ind = ωL

donde C es la capacitancia en Faradios, L la inductancia en Henrys, frequency la frecuencia en radianes / segundo y Z la magnitud de la impedancia compleja resultante en ohmios. Tenga en cuenta que ω puede expandirse a 2πf, donde f es la frecuencia en Hz.

Tenga en cuenta que la impedancia de la tapa disminuye con la frecuencia a medida que aumenta la impedancia del inductor.

La frecuencia de caída del filtro de paso bajo es cuando las dos magnitudes de impedancia son iguales. De las ecuaciones anteriores, eso sale a

f = 1 / (2π sqrt (LC))

que es 734 Hz ​​con el valor de la parte que se muestra arriba. Por lo tanto, la frecuencia PWM de 100 kHz es aproximadamente 136 veces esta frecuencia de caída. Dado que está más allá de la región de "rodilla" del filtro, atenuará una señal de voltaje por el cuadrado de eso, que es aproximadamente 19k veces en este caso. Después de que la onda cuadrada de 12 Vpp se atenúe 19,000 veces, no quedará ninguna consecuencia para esta aplicación. Los armónicos restantes se atenuarán aún más. El siguiente armónico en una onda cuadrada es el tercero, que se atenuará otras 9 veces más que el fundamental.

El valor actual para los inductores es cualquiera que sea la corriente máxima que deben poder transportar. Veo que cometí un error allí, ahora que lo estoy mirando más de cerca. En un convertidor buck típico, la corriente máxima del inductor es siempre un poco más que la media. Incluso en modo continuo, la corriente del inductor es idealmente una onda triangular. Como el promedio es la corriente de salida general, los picos son claramente más altos.

Sin embargo, esa lógica no se aplica a este caso particular. La corriente máxima es al 100% del ciclo de trabajo PWM, lo que significa que los 12 V se aplican directamente al Peltier de forma continua. En ese punto, el promedio total y las corrientes inductoras máximas son las mismas. A corrientes más bajas, las corrientes inductoras son un triángulo, pero el promedio también es más bajo. Al final, solo necesita los inductores para manejar la corriente de salida continua máxima. Dado que la corriente máxima total a través del Peltier es de aproximadamente 6 A, cada inductor solo necesita poder manejar 3 A. Los inductores con una clasificación de 3.5 A seguirían funcionando bien, pero los inductores de 3 A también serían lo suficientemente buenos.


1
Hola Olin, me alegro de verte. Gracias por la respuesta detallada. Soy consciente de los PWM, sin embargo, recientemente leí un par de artículos que indicaban que tal vez no sean ideales para usar con un peltier, así que me mantuve alejado. Sé que Arduino generalmente también tiene una serie de canales que son PWM. Todavía no he leído su respuesta completa, necesitaré algo de tiempo. Sin embargo, creo que veo a qué te refieres. ¿Alguna posibilidad de que puedas hablar sobre el uso de un controlador PWM con un peltier?
jrista

1
@jrista: Lea la respuesta completa, luego avíseme si aún tiene preguntas sobre Peltiers y PWM. Traté de abordar los problemas específicamente, pero es posible que deba agregar algunas aclaraciones.
Olin Lathrop

1
Gracias, ahora entiendo el concepto. También entiendo el punto sobre el ciclismo térmico de alta peltier, tiene sentido. No entiendo las opciones de componentes específicos (es decir, por qué elegiste L1 para ser 100uH 3.5a, o C1 para ser 470uF 20V, etc.), espero que sea solo un punto débil de no ser un experto en electrónica, y no en realidad habiendo jugado con la electrónica durante más de una década. : P La única pregunta real que tengo ahora es, ¿puede un Arduino hacer las cosas más únicas (es decir, diferencial de fase de 180 ° para los PWM)? Me gusta Arduino por su comunidad, diversidad y capacidad de programación, y puedo hacer MUCHO con eso.
jrista

1
Oh, con respecto a los peltiers. Hasta donde yo sé, el óptimo es 12v 5.8a. El rango de voltaje era algo así como 5v o 7v hasta 15.4v. No hubo ninguna otra mención de amperaje, aparte del 5.8a. Tengo números de identificación en los propios tecs, por lo que probablemente pueda buscar información más detallada (acabo de recoger una caja de 5 70 W de Amazon por un precio bastante barato (y, enviado desde los EE. UU., En lugar de Hong Kong ... Estoy seguro de que puedes descubrir mi mayor preocupación allí. :)).
jrista

1
Gracias por la edición, Olin. Muy útil. Voy a utilizar este enfoque, parece muy sólido. El único problema que tengo ahora es encontrar un microcontrolador que sea fácil de programar, pero que también admita la capacidad de cambiar la fase de los PWM. Compré un Arduino, pero no parece que realmente sea compatible con el cambio de fase. Realmente me gusta la programabilidad de Arduino ... así que eso es realmente un fastidio. Puedo hacer una nueva pregunta sobre cómo encontrar una manera de cambiar o retrasar el ciclo de trabajo de una salida PWM ...
jrista

2

Tienes la idea correcta, aunque hay algunos detalles que necesitan atención.

Primero, a menos que pueda proporcionar un aislamiento realmente bueno, una caja de enfriamiento de dos etapas puede no ser un enfoque razonable. De hecho, los enfriadores de dos etapas proporcionarán diferenciales de alta temperatura, pero solo para potencias de enfriamiento muy bajas en la segunda cara. Tenga en cuenta que, como regla general, un TEC puede enfriarse con solo un 10% de eficiencia. Sus elementos Peltier tienen aproximadamente 70 vatios, por lo que una sola etapa puede enfriar 7 vatios (aunque probablemente no esté cerca del delta T deseado). Esto significa que su segunda etapa solo puede funcionar a 7 vatios en total, no 70 vatios, y a su vez solo puede absorber alrededor de .7 vatios. De nuevo, a este nivel no obtendrás grandes delta Ts. Los fabricantes de TEC proporcionan curvas diferenciales de potencia / temperatura que debe examinar. Hacer una carcasa de cámara que solo tenga una fuga de medio vatio de energía térmica será una tarea, especialmente porque necesita acoplarlo a un telescopio.

En segundo lugar, la mayoría de las placas de CPU Arduino permiten salidas PWM, que son exactamente lo que necesita para modular su unidad TEC. Sin embargo, deberá detectar la temperatura de su caja de enfriamiento y crear un circuito de retroalimentación en el software. Puede hacerlo fácilmente usando, por ejemplo, un termistor y una resistencia, con el termistor conectado a su caja de enfriamiento, pero debe prestar atención a lo que está haciendo. Dado que la temperatura generalmente varía lentamente para objetos grandes, su frecuencia PWM no necesita ser muy alta, y un controlador de solenoide podría funcionar. No es una buena idea en términos de confiabilidad a largo plazo, ya que los relés generalmente tienen un número limitado de ciclos de conmutación antes de que los contactos se desgasten, pero podría ser un comienzo. El estado sólido es mejor. No solo eso, sino que puede necesitar circuitos de control de temperatura independientes para cada enfriador.

Y como última consideración, necesitará encontrar una manera de evitar que su elemento óptico externo se empañe. Será frío y propenso a la condensación del aire exterior. Esto se puede hacer soplando aire seco o nitrógeno continuamente,


Gracias por la respuesta. Sin embargo, algunas preguntas sobre sus declaraciones sobre el TEC. Anoche hice algunas pruebas con varios de los peltiers. Cada uno fue capaz de enfriar la placa fría a 35-37 ° F desde la temperatura ambiente de 70 ° F, y mantener esa temperatura. Eso es un delta-t de aproximadamente 35 ° F / 20 ° C. No estoy seguro de cómo eso se traduce en vatios en el contexto de su respuesta, o qué tan cerca de 70 o 7 vatios es ese diferencial. Si hacer un enfriador de doble etapa es difícil, tal vez debería usar uno más peltier a cada lado de la caja fría ...
jrista

Ah, y para notar ... Creo que estaba superando a los peltiers. Tomé un adaptador de CA / CC y olvidé verificar la potencia nominal. Se clasificó a 5 amperios, por lo que no estoy seguro de que el peltier, cuando alcanzó los -20 ° C, funcionara de la manera más eficiente posible (ya sea solo 10% o más). Espero que cuando sea completamente y correctamente alimentado, funcionará de manera más eficiente y tal vez alcance un delta de 25-30 ° C.
jrista

Finalmente, con respecto a la óptica y la condensación. La caja fría estará bastante aislada, con un material aislante de 1 "de grosor. El" telescopio "es en realidad una lente Canon EF 600 mm f / 4 L II, que está cubierta con un LensCoat de neopreno. El elemento óptico más trasero en el la lente está a varias pulgadas del soporte de la lente en la cámara. Además de eso, vivo en Colorado ... la humedad promedio en mi casa es de aproximadamente 16%, tal vez tan alta como 25% en algunos de los sitios oscuros imagen en.;)
jrista

Conducir un Peltier con PWM directamente es una mala idea, especialmente a frecuencias tan bajas como las que usaría con un relé como interruptor. Vea mi respuesta para obtener detalles sobre por qué esto es malo, pero básicamente ejecuta el Peltier en su punto menos eficiente, y lo destruirá rápidamente debido al ciclo térmico.
Olin Lathrop

@WhatRoughBeast: Según la respuesta de Olins, creo que entiendo mejor la tuya. Cuando menciona que la eficiencia de un peltier es solo del 10%, se refiere básicamente a la cantidad de calor extraído de la placa fría a la placa caliente, frente a la cabeza disipada total en la placa caliente. Con la diferencia de ser la energía generada por el peltier mismo. ¿Es eso correcto? De esos 70 vatios, alrededor de 7 vatios son energía realmente "enfriada", mientras que 63 vatios son la energía calorífica realmente generada por el peltier, ¿simplemente como consecuencia de que una corriente lo atraviese?
jrista

0

Es posible que desee comprender cómo diseñar la refrigeración térmica y la desempañado del calentador dentro de la cámara.

Comience mirando los diseños existentes. No quieres construir una caja de hielo de Mickey Mouse y dañar tu D50.

http://www.centralds.net/en/astro60d.htm#safe

He construido un par de cajas de hielo de -50 ° C con hielo seco @ 2 $ por ladrillo. y un ventilador de 3W. -40C es fácil. -50C es difícil, mientras que el hielo midió -65C en la superficie. Usé una caja de picnic con espuma aislante de 2 ".

Puede usar un disipador de calor de CPU cuadrado de la vieja escuela para el refrigerador Peltier para la segunda etapa y usar hielo seco para la primera etapa de cualquier fábrica de lácteos ...

con "cargas" de desecante seco ... bajo su propio riesgo ... del impacto químico en su cámara.

El calentamiento se reguló a 2 grados / min para reducir el riesgo de condensación. y la caja caliente a 45 ° C se creó colgando un soldador de 25 W que utilicé para probar el producto, que no necesitará, pero necesitará un calentador dentro de su cámara.


Idea interesante. Parece que esto requiere una fuerte modificación de la DSLR. También uso mi 5D III para todas mis fotografías normales, así que no quiero hacer ningún modding. Solo necesito algo en lo que pueda colocarlo, conectar una lente o telescopio y enfriarlo con un delta-T en algún lugar entre 30-40 ° C. Sé que no se enfriará tanto como si enfríe directamente el conjunto del sensor, pero ya sé que para cuando la temperatura baje a entre -5 ° C y 0 ° C, el ruido es muy bajo y muy manejable (gracias a -8 ° C temps este febrero.;))
jrista

0

Puede usar PWM, solo necesita asegurarse de que la frecuencia sea lo suficientemente alta. Mucha gente les pone filtros porque no pueden funcionar a frecuencias superiores a 100Hz, lo que probablemente disminuya la velocidad. Hay varios proveedores que respaldan esta afirmación, pero también hay varios proveedores a los que no les gusta. Por lo tanto, existe mucha información errónea. Personalmente, he ejecutado peltiers con PWM sin problemas.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.