El controlador de interrupción & lt; código de & gt; #define FIRST_ADC_INPUT 2 #define LAST_ADC_INPUT 7 unsigned int real_adc [8] = {0, 0, 0, 0, 0, 0, 0, 0}; sample_adc unsigned char; volátil adc_ready unsigned char = 0; leds unsigned char [8] = {0x21, 0x41, 0x61, 0x63, 0x23, 0x43}; adc_inputs unsigned char [8] = {0, 1, 2, 4, 6, 7, 3, 5}; interrumpir [ADC_INT] vacío adc_isr (void) ////////////// ADC_INT {unsigned char estática input_index = 0; si (== adc_ready 0) {if (sample_adc == 0) {real_adc [input_index] = (firmado int) (ADCW); si (input_index & lt; LAST_ADC_INPUT-FIRST_ADC_INPUT) {input_index ++; } Else {input_index = 0; PORTB = leds [input_index]; sample_adc = 1; } ADMUX = (ADC_VREF_TYPE & amp; 0xff) + adc_inputs [(FIRST_ADC_INPUT + input_index)]; ADCSRA | = 0x40; } Else {if (== adc_ready 0) {if (ADCW & gt; real_adc [input_index]) {real_adc [input_index] = (firmado int) (ADCW); } Else {real_adc [input_index] = (firmado int) (real_adc [input_index]); } Si (input_index & lt; (LAST_ADC_INPUT-FIRST_ADC_INPUT)) {input_index ++; PORTB = leds [input_index]; } Else {input_index = 0; adc_ready = 1; PORTB & amp; = ~ (1 & lt; & lt; 0); } ADMUX = (ADC_VREF_TYPE & amp; 0xff) + adc_inputs [(FIRST_ADC_INPUT + input_index)]; } Si (== adc_ready 0) {ADCSRA | = 0x40; }}}} & Lt; / Código & gt; pre>
Implementación de PID & lt; código de & gt; si (== adc_ready 1) {adc_l = (real_adc [1] + real_adc [2]); adc_r = (real_adc [3] + real_adc [4]); error = (adc_l-adc_r); delta_error = Error - old_error; // Sum_error + = error; PID = Kp * Error + Kd * delta_error + Ki * sum_error; old_error = error; si (PID & gt; 0) {pwr_l + = (firmado int) PID; pwr_r - = (int firmado) PID; } Else {pwr_l + = (firmado int) PID; pwr_r - = (int firmado) PID; } For (i = 0; i & lt; (LAST_ADC_INPUT-FIRST_ADC_INPUT) 1; i ++) {real_adc [i] = 0; } ADCSRA | = 0x40; adc_ready = 0; sample_adc = 0; } & Lt; / Código & gt; pre>
Como yo estaba contento de ver que el robot realiza las funciones que tiene encomendadas, no es tan seguro vídeos cómo escarpadas con linefolower'ami absolutamente suave y rápido, pero para mí, aunque este resultado estaba alcanzando.
Luego me calmé un poco con una parte de la programación del microcontrolador y me di cuenta de que en el futuro tendrán que poner en práctica un programa para controlar el robot desde un ordenador y comencé el estudio de Qt, así como el software más reciente para el PC, escribí sólo en la universidad (en Pascal), y era un poco -Que Informática estándar de laboratorio, mi conocimiento era casi cero.
offtopic, sobre mi grandes planes de control del robot con su smartphone y cómo me di por vencido y marqué en la idea En realidad, yo inicialmente sintió el impulso de escribir un programa para un teléfono móvil con Android, pero no querían aprender Java, o más bien no quería lejos de C, y tengo un amigo que perdió el balón en Qt y podría ser mucho pedir. Al principio traté de entender a sí mismo con Zen Qbluetooth e intenta acoplarse con la HC-05 con la ayuda de mi g3 Jiayu chino, pero cada vez que me encontré con un problema que no permitía los HC-05 y Jiayu amigos. En primer pecado en Qbluetooth y el hecho de que él no percibe HC-05, pero en Internet se encontró información que la gente comienza comunicación por línea a través del módulo Bluetooth HC utilizando QBluetooth o escribir su biblioteca después de quejarse a un amigo sobre su dura vida, uno un día escribió un programa y se las arregló para comunicarse con el robot, pero lamentablemente a través de la tableta. Como resultado, lo que justifica todos aquellos que mi chino no se admite rfcomm, me rendí y decidí escribir todo el PC.
El programa tuvo que cambiar de modo de robot (el seguir adelante, el control del teclado, sin conexión) y emisión (set) de datos de todos los sensores de interés (servos, sensores, línea, telémetro ultrasónico, motores, encoders).
Después de un par de semanas, escribió la primera versión del panel de control controla el robot. Muy contentos de trabajar con GUI en Qt -. Conveniente
Programa code'd lugar no incrusta, así que no fue prohibido por la burla de Cu. En resumen, diría que el programa simplemente para indicar la disponibilidad de datos en QSerialPort los lleva y empujar en las etiquetas y widgets, en respuesta a un contador de tiempo, si es necesario, envía un dato predeterminadas tales como posición y velocidad servomotores. Campo verde en el programa es en los sueños - el futuro mapa de la ubicación frente al robot
.
El programa acepta todos los datos disponibles y temporalmente actúa como un depurador. Aún no se ha implementado el control del teclado, y fuera de línea es muy crudo y sólo ver el robot hasta que el obstáculo se ha fijado en un ángulo predeterminado y tratando de ir en una nueva dirección. En general, como ya he dicho, todo el proyecto hasta que la humedad en la parte de software.
En el futuro sería deseable implementar planes ambiciosos que son un poco de comprensión tapón que es necesario modificar el programa, tanto en el MC y el PC por completo, ya que hice un gran error y empecé a escribir ambos programas como pastel de capas hinchada en un módulo de prueba se encuentra junto a otro, en lugar de como una estricta sistema estructurado. Pero lo más importante es no darse por vencido y trabajar hasta que lo que tiene en mente en la cabeza no se hará realidad en el mundo material, porque este es el significado de un hobby.
PS En el futuro, voy a tratar de escribir otra parte de la publicación, por así decirlo medida que avanzamos en la parte de software.
Fuente: habrahabr.ru/post/256209/