Advertisement
Guest User

Dois codgos em um

a guest
Jul 30th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.50 KB | None | 0 0
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8. #define irLedPin 4 // Ir Led neste pino############################# siguinifica do outro codgo#####################
  9. #define irSensorPin 5 // Sensor IR neste pino#########################
  10.  
  11.  
  12.  
  13.  
  14. #include <PinChangeInt.h>
  15.  
  16. #include <Servo.h>
  17.  
  18. // Assign your channel in pins
  19. #define THROTTLE_IN_PIN 8
  20. #define STEERING_IN_PIN 9
  21. #define AUX_IN_PIN 10
  22.  
  23. // Assign your channel out pins
  24. #define THROTTLE_OUT_PIN 5
  25. #define STEERING_OUT_PIN 6
  26. #define AUX_OUT_PIN 7
  27.  
  28. // Os objetos Servo geram os sinais esperados pelos Controladores e Servos de Velocidade Eletrônicos
  29. // Usaremos os objetos para produzir os sinais que lemos
  30. // este código de exemplo fornece uma passagem direta do sinal sem processamento personalizado
  31. Servo servoThrottle;
  32. Servo servoSteering;
  33. Servo servoAux;
  34.  
  35. // Esses sinalizadores de bits são definidos em bUpdateFlagsShared para indicar qual
  36. // canais têm novos sinais
  37. #define THROTTLE_FLAG 1
  38. #define STEERING_FLAG 2
  39. #define AUX_FLAG 4
  40.  
  41. // contém as bandeiras de atualização definidas acima
  42. volatile uint8_t bUpdateFlagsShared;
  43.  
  44. // variáveis compartilhadas são atualizadas pelo ISR e lidas por loop.
  45. // Em loop, imediatamente pegamos cópias locais para que o ISR possa manter a propriedade do
  46. // compartilhados. Para acessar estes no loop
  47. // primeiro desligamos as interrupções com não Interrupções
  48. // tiramos uma cópia para usar no loop e as interrupções de volta de volta
  49. // o mais rápido possível, isso garante que sempre possamos receber novos sinais
  50. volatile uint16_t unThrottleInShared;
  51. volatile uint16_t unSteeringInShared;
  52. volatile uint16_t unAuxInShared;
  53.  
  54. // Estes são usados para registrar a margem ascendente de um pulso nas funções calcInput
  55. // Eles não precisam ser voláteis, pois são usados apenas no ISR. Se quiséssemos
  56. // para se referir a estes em loop e ao ISR, eles deveriam ser declarados voláteis
  57. uint32_t ulThrottleStart;
  58. uint32_t ulSteeringStart;
  59. uint32_t ulAuxStart;
  60.  
  61. void setup()
  62. {
  63.  
  64. pinMode(irSensorPin, INPUT);#######################################
  65. pinMode(irLedPin, OUTPUT); ######################################
  66.  
  67.  
  68. Serial.begin(9600);
  69.  
  70. Serial.println("multiChannels");
  71.  
  72.  
  73. servoThrottle.attach(THROTTLE_OUT_PIN);
  74. servoSteering.attach(STEERING_OUT_PIN);
  75. servoAux.attach(AUX_OUT_PIN);
  76.  
  77. // using the PinChangeInt library, attach the interrupts
  78. // used to read the channels
  79. PCintPort::attachInterrupt(THROTTLE_IN_PIN, calcThrottle,CHANGE);
  80. PCintPort::attachInterrupt(STEERING_IN_PIN, calcSteering,CHANGE);
  81. PCintPort::attachInterrupt(AUX_IN_PIN, calcAux,CHANGE);
  82. }
  83.  
  84. void loop()
  85. {
  86.  
  87. Serial.println(irRead(irSensorPin, irLedPin)); // exibe os resultados######################################################
  88. // criar variáveis locais para armazenar cópias locais das entradas de canal
  89. // Estes são declarados estáticos para que seus valores sejam mantidos
  90. // between calls to loop.
  91. static uint16_t unThrottleIn;
  92. static uint16_t unSteeringIn;
  93. static uint16_t unAuxIn;
  94. // local copy of update flags
  95. static uint8_t bUpdateFlags;
  96. int irRead(int readPin, int triggerPin)######################################################################################
  97. {
  98. int halfPeriod = 13; // um período de 38.5khZ é de aproximadamente 26 microssegundos#########################################
  99. int cycles = 38; // 26 microseconds * 38 é mais ou menos 1 milissegundo########################################################
  100. int i; ########################################################################
  101. for (i=0; i <=cycles; i++) ###########################################################################
  102. {
  103. digitalWrite(triggerPin, HIGH); ################################################################################
  104. delayMicroseconds(halfPeriod);##########################################################################
  105. digitalWrite(triggerPin, LOW); ########################################################################
  106. delayMicroseconds(halfPeriod - 1); // - 1 para compensar DigitaWrite sobrecarga#####################################
  107. }
  108. return digitalRead(readPin);########################################################################################
  109. }
  110. // check shared update flags to see if any channels have a new signal
  111. if(bUpdateFlagsShared)
  112. {
  113. noInterrupts(); // Desliga-se rapidamente enquanto tomamos cópias locais das variáveis compartilhadas
  114.  
  115. // Pegue uma cópia local de quais canais foram atualizados caso precisamos usar isso no resto do loop
  116. bUpdateFlags = bUpdateFlagsShared;
  117.  
  118. // No código atual, os valores compartilhados são sempre preenchidos
  119. // Para que possamos copiá-los sem testar as bandeiras
  120. // No entanto, no futuro isso pode mudar, então vamos
  121. // Apenas copie quando as bandeiras nos dizem que podemos.
  122.  
  123. if(bUpdateFlags & THROTTLE_FLAG)
  124. {
  125. unThrottleIn = unThrottleInShared;
  126. }
  127.  
  128. if(bUpdateFlags & STEERING_FLAG)
  129. {
  130. unSteeringIn = unSteeringInShared;
  131. }
  132.  
  133. if(bUpdateFlags & AUX_FLAG)
  134. {
  135. unAuxIn = unAuxInShared;
  136. }
  137.  
  138. // Limpe a cópia compartilhada de sinalizadores atualizados, já que já tomamos as atualizações
  139. // Ainda temos uma cópia local se precisarmos usá-la em bUpdateFlags
  140. bUpdateFlagsShared = 0;
  141.  
  142. interrupts(); //Nós temos cópias locais das entradas, então agora podemos fazer as interrupções de volta
  143. // Assim que as interrupções estiverem de volta, não podemos mais usar as cópias compartilhadas, a interrupção
  144. // As rotinas de serviços possuem essas e podem atualizá-las a qualquer momento. Durante a atualização, o
  145. // As cópias compartilhadas podem conter lixo. Felizmente, temos nossas cópias locais para trabalhar com :-)
  146. }
  147.  
  148. // Faça qualquer processamento a partir daqui em diante
  149. // Use apenas valores locais unAuxIn, unThrottleIn e unSteeringIn, o compartilhado
  150. //Variáveis unAuxInShared, unThrottleInShared, unSteeringInShared são sempre propriedade de
  151. // As rotinas de interrupção e não devem ser usadas em loop
  152.  
  153. // O código a seguir fornece passagem simples
  154. // Este é um bom teste inicial, o Arduino irá passar
  155. // Entrada do receptor como se o Arduino não estivesse lá.
  156. // Isso deve ser usado para confirmar o circuito e a alimentação
  157. // Antes de tentar qualquer processamento personalizado em um projeto.
  158.  
  159. // Estamos verificando se o valor do canal mudou, isto é indicado
  160. // Pelas bandeiras. Para o simples passe, realmente não precisamos deste cheque,
  161. // Mas para um projeto mais complexo, onde um novo sinal requer um processamento significativo
  162. // Isso nos permite apenas calcular novos valores quando temos novas entradas, em vez de
  163. // Em todos os ciclos.
  164. if(bUpdateFlags & THROTTLE_FLAG)
  165. {
  166. if(servoThrottle.readMicroseconds() != unThrottleIn)
  167. {
  168. servoThrottle.writeMicroseconds(unThrottleIn);
  169. }
  170. }
  171.  
  172. if(bUpdateFlags & STEERING_FLAG)
  173. {
  174. if(servoSteering.readMicroseconds() != unSteeringIn)
  175. {
  176. servoSteering.writeMicroseconds(unSteeringIn);
  177. }
  178. }
  179.  
  180. if(bUpdateFlags & AUX_FLAG)
  181. {
  182. if(servoAux.readMicroseconds() != unAuxIn)
  183. {
  184. servoAux.writeMicroseconds(unAuxIn);
  185. }
  186. }
  187.  
  188. bUpdateFlags = 0;
  189. }
  190.  
  191.  
  192. // Rotina de serviço de interrupção simples
  193. void calcThrottle()
  194. {
  195. // Se o pino estiver alto, é uma margem ascendente do pulso do sinal, de modo a registrar seu valor
  196. if(digitalRead(THROTTLE_IN_PIN) == HIGH)
  197. {
  198. ulThrottleStart = micros();
  199. }
  200. else
  201. {
  202. // Senão deve ser uma borda descendente, então vamos dar o tempo e subtrair o tempo da margem ascendente
  203. // Isso dá uso do tempo entre os limites ascendente e descendente, isto é, a duração do pulso.
  204. unThrottleInShared = (uint16_t)(micros() - ulThrottleStart);
  205. // Use set the throttle flag para indicar que um novo sinal de aceleração foi recebido
  206. bUpdateFlagsShared |= THROTTLE_FLAG;
  207. }
  208. }
  209.  
  210. void calcSteering()
  211. {
  212. if(digitalRead(STEERING_IN_PIN) == HIGH)
  213. {
  214. ulSteeringStart = micros();
  215. }
  216. else
  217. {
  218. unSteeringInShared = (uint16_t)(micros() - ulSteeringStart);
  219. bUpdateFlagsShared |= STEERING_FLAG;
  220. }
  221. }
  222.  
  223. void calcAux()
  224. {
  225. if(digitalRead(AUX_IN_PIN) == HIGH)
  226. {
  227. ulAuxStart = micros();
  228. }
  229. else
  230. {
  231. unAuxInShared = (uint16_t)(micros() - ulAuxStart);
  232. bUpdateFlagsShared |= AUX_FLAG;
  233. }
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement