Advertisement
SanjaBgk

Arduino и железнодорожный переезд из LEGO

Dec 2nd, 2012
535
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.40 KB | None | 0 0
  1. // Светодиоды светофора:
  2. int ledKrasnyj = 3; // Красный подключён через резистор 470 Ом к цифровому (digital)
  3.                     // пину Ардуино с номером 5
  4. int ledZheltyj = 13; // жёлтый - к тринадцатому ,
  5. int ledZelenyj = 5; // зелёный - к третьему. Вторые ножки светодиодов подключаем к пину 5V.
  6.  
  7. // Будем использовать 2 сервомотора:
  8. #include <Servo.h>
  9. Servo ServoMotor_A; // Сервомотор A
  10. Servo ServoMotor_B; // Сервомотор Б
  11.  
  12. int Ugol_A = 0;     /* Нам надо будет запоминать, на какой угол повёрнут сервомотор A,
  13.  поэтому мы его будем записывать в переменную "Ugol_A" */
  14. int Ugol_B = 0;     /* Нам надо будет запоминать, на какой угол повёрнут сервомотор Б,
  15.  поэтому мы его будем записывать в переменную "Ugol_B" */
  16.  
  17. int UgolMAX = 65;   // Максимальный угол поворота шлагбаума
  18.  
  19. // DEBUG int Shlagbaum = 0;
  20.  
  21. /* Поскольку шлагбаумы к сервомоторам пререплены не очень ровно, приходится подобрать
  22.  небольшую поправку к углам поворотов сервомоторов:
  23.  */
  24.  
  25. int ServoMotorAPopravka = 0;
  26. int ServoMotorBPopravka = 0;
  27.  
  28. /*
  29.  Будем использовать фоторезистор.
  30.  Контакт VCC подключаем к пину 5V, контакт GND - к пину GND.
  31.  Последним подключаем контакт "AO" ("Analog output") к пину A0
  32.  на Arduino:
  33.  */
  34.  
  35. int FotoResistorPin = 0;
  36.  
  37. /*
  38.  В зависимости от силы света на пине "A0" будут появляться значения от
  39.  нуля до 1023. Ноль - это совсем светло (на датчик попадает яркий свет),
  40.  1023 - очень темно (на датчик не попадает вообще никакого света).
  41.  На старте считаем что датчик затемнён (будто поезд уже подъезжает к переезду):
  42.  */
  43.  
  44. int FotoResistorSilaSveta = 1023;
  45.  
  46. /*
  47.  На датчик обычно попадает чуточка света - так что ноль он обычно никогда не показывает.
  48.  Надо договориться о каком-то числе - "отсечке": если датчик будет показывать больше,
  49.  то будем считать, что сейчас темно, а если меньше - то светло.
  50.  Это число надо подбирать опытным путём, потому что все датчики немножко отличаются.
  51.  В нашем случае "отсечка" равна "650":  
  52.  */
  53.  
  54. int FotoResistorOtsechka = 650;
  55.  
  56. // Программа, которая гасит светофор:
  57. void SvetoforVykl(){
  58.   // Зажигаем один светодиод, другие - гасим
  59.   digitalWrite(ledKrasnyj, LOW);  
  60.   digitalWrite(ledZheltyj, LOW);
  61.   digitalWrite(ledZelenyj, LOW);
  62.   Serial.println("[!] Svetofor: vikluchen");
  63. }
  64.  
  65. // Программа, которая зажигает на светофоре красный:
  66. void SvetoforKrasnyj(){
  67.   digitalWrite(ledKrasnyj, HIGH);  
  68.   Serial.println("[!] Svetofor: KRASNYJ");
  69. }
  70.  
  71. // Программа, которая зажигает на светофоре жёлтый:
  72. void SvetoforZheltyj(){
  73.   digitalWrite(ledZheltyj, HIGH);
  74.   Serial.println("[!] Svetofor: ZHELTYJ");
  75. }
  76.  
  77. // Программа, которая зажигает на светофоре зелёный:
  78. void SvetoforZelenyj(){
  79.   digitalWrite(ledZelenyj, HIGH);  
  80.   Serial.println("[!] Svetofor: ZELENYJ");
  81. }
  82.  
  83. /* После того, как все настройки завершены, Arduino начнёт по кругу выполнять команды,
  84.  которые хранятся в программе "loop" ("loop" с английского переводится как "круг"):
  85.  */
  86.  
  87. void loop()
  88. {
  89.   // Сначала смотрим, что показывает датчик света.
  90.   // Для этого считываем величину силы света из FotoResistorPin
  91.   // в переменную "FotoResistorSilaSveta"  
  92.  
  93.   FotoResistorSilaSveta = analogRead(FotoResistorPin);
  94.  
  95.   // Для удобства тестирования отправляем полученное значение в компьютер:
  96.   Serial.print("[i] Datchik sveta pokazyvaet: ");
  97.   Serial.println(FotoResistorSilaSveta);
  98.  
  99.   /* Теперь проверяем: полученное с датчика значение больше "отсечки" (то есть сейчас светло)
  100.    или меньше отсечки (то есть сейчас темно)?
  101.    */
  102.   if(FotoResistorSilaSveta < FotoResistorOtsechka ){
  103.     // Если светло, открываем шлагбаум и пишем в компьютер:    
  104.     Serial.println("[+] Svetlo");
  105.     // И открываем шлагбаум:
  106.     //if (Shlagbaum = 0){
  107.       OtkrytSchlagbaum();
  108.     //}
  109.     // SvetoforZelenyj();
  110.   }
  111.   else{
  112.     // Ну а если темно, закрываем и тоже пишем в компьютер:    
  113.     Serial.println("[-] Temno");
  114.     // И закрываем шлагбаум:
  115.     //if (Shlagbaum = 1){
  116.       ZakrytSchlagbaum();
  117.     //}
  118.     // SvetoforKrasnyj();
  119.   }
  120.  
  121.   // Чтобы не сильно мучить датчик, делаем короткую паузу перед тем, как всё начать снова:
  122.   delay(1000);
  123.  
  124. }
  125.  
  126. // Программа, которая открывает шлагбаумы:
  127. void OtkrytSchlagbaum(){
  128.   //DEBUG if (Shlagbaum = 0){
  129.     // Открываем шлагбаум:
  130.     // SvetoforZheltyj();
  131.     while ( (Ugol_A - ServoMotorAPopravka) < UgolMAX ){
  132.       Ugol_A = Ugol_A + 1;
  133.       Serial.print("Shlagbaum A: otkryvaem na ugol ");
  134.       Serial.println(Ugol_A - ServoMotorAPopravka);  
  135.       ServoMotor_A.write(Ugol_A - ServoMotorAPopravka);
  136.       delay(1);  
  137.     }
  138.  
  139.     while (  (Ugol_B - ServoMotorBPopravka) < UgolMAX    ){
  140.       Ugol_B = Ugol_B + 1;
  141.       Serial.print("Shlagbaum B: otkryvaem na ugol ");
  142.       Serial.println(Ugol_B - ServoMotorBPopravka);  
  143.       ServoMotor_B.write(Ugol_B - ServoMotorBPopravka);  
  144.       delay(1);
  145.     }
  146.     delay(900);
  147.     SvetoforVykl();
  148.     SvetoforZelenyj();
  149.   //DEBUG   Shlagbaum = 1;
  150.     Serial.println("Shlagbaum OTKRYT");
  151.   //DEBUG }
  152. }
  153.  
  154. // Программа, которая закрывает шлагбаумы:
  155. void ZakrytSchlagbaum(){
  156.   // Закрываем шлагбаум:
  157.   //DEBUG if (Shlagbaum = 1){
  158.     // SvetoforZheltyj();
  159.     while ( (Ugol_A - ServoMotorAPopravka) > 0 ){
  160.       Ugol_A = Ugol_A - 1;  
  161.       if ((Ugol_A - ServoMotorAPopravka) >= 0){  
  162.         Serial.print("Shlagbaum A: zakryvaem na ugol ");
  163.         Serial.println(Ugol_A  - ServoMotorAPopravka);  
  164.         ServoMotor_A.write(Ugol_A - ServoMotorAPopravka);
  165.         delay(1);
  166.       }  
  167.     }
  168.  
  169.     while ( (Ugol_B - ServoMotorBPopravka) > 0 ){
  170.       Ugol_B = Ugol_B - 1;  
  171.       if ((Ugol_B - ServoMotorBPopravka) >= 0){  
  172.         Serial.print("Shlagbaum B: zakryvaem na ugol ");
  173.         Serial.println(Ugol_B  - ServoMotorBPopravka);  
  174.         ServoMotor_B.write(Ugol_B - ServoMotorBPopravka);
  175.         delay(1);
  176.       }  
  177.     }
  178.     delay(900);
  179.     SvetoforVykl();
  180.     SvetoforKrasnyj();
  181.   //DEBUG   Shlagbaum = 0;
  182.     Serial.println("Shlagbaum ZAKRYT");
  183.   //DEBUG }
  184. }
  185.  
  186. /*
  187.  До этого момента мы только объявляли переменные.
  188.  Теперь в служебной программе "setup" мы в них запишем
  189.  стартовые значения. Программа "setup" выполняется Arduino один раз,
  190.  когда устройство включается:
  191.  */
  192.  
  193. void setup()
  194. {
  195.  
  196.   Serial.begin(9600);      /* Говорим Arduino, что мы хотим отправлять сигналы в компьютер
  197.    и читать их в PUTTY */
  198.  
  199.   // Светодиоды светофора:
  200.   pinMode(ledKrasnyj, OUTPUT);    
  201.   pinMode(ledZheltyj, OUTPUT);    
  202.   pinMode(ledZelenyj, OUTPUT);    
  203.  
  204.  
  205.   /* Заканчиваем настройку сервомоторов - говорим Arduino,
  206.    к каким пинам какой сервомотор подключён */
  207.   ServoMotor_A.attach(9,  500, 2200);  // Контакт сервомотора А помечен как "Servo_2" на Motor shield
  208.   ServoMotor_B.attach(10, 500, 2200);  // Контакт сервомотора Б помечен как "Ser1" на Motor shield
  209.  
  210.   // Приводим сервомоторы в стартовое положение:
  211.   Serial.print("Ugol servomotora A: ");
  212.   Serial.println(Ugol_A + ServoMotorAPopravka);
  213.   ServoMotor_A.write(Ugol_A + ServoMotorAPopravka);
  214.  
  215.   Serial.print("Ugol servomotora B: ");
  216.   Serial.println(Ugol_B + ServoMotorBPopravka);
  217.   ServoMotor_B.write(Ugol_B + ServoMotorBPopravka);
  218.  
  219.   delay(3500);
  220.  
  221.   SvetoforKrasnyj();
  222.   // ZakrytSchlagbaum();
  223.  
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement