#1 2015-04-04 19:10:20

yebaluzoze
Учасник
Зареєстрований: 2015-04-04
Повідомлень: 1

Помогите исправить код - ато незнаю уже что делать...

#include <Servo.h>

#define coef 10 //(коэффициент соответствия 10 градусов на 1см)
#define dead_zone 4
#define max_value 22
#define servoPin 10

#define Trig 9
#define Echo 8
#define ledPin 13

Servo myservo;

void setup() 
{ 
  pinMode(Trig, OUTPUT); //инициируем как выход
  pinMode(Echo, INPUT);  //инициируем как вход
  pinMode(ledPin, OUTPUT);
  myservo.attach(servoPin);
  myservo.write(0);
}

unsigned int impulseTime=0;
unsigned int distance_sm=0;

void loop() 
{ 
  digitalWrite(Trig, HIGH); /* Подаем импульс на вход
   trig дальномера */
  delayMicroseconds(10);  // равный 10 микросекундам
  digitalWrite(Trig, LOW); // Отключаем 
  impulseTime = pulseIn(Echo, HIGH); // Замеряем длину импульса 
  distance_sm = impulseTime/58; // Пересчитываем в сантиметры 
  
  if (distance_sm >= dead_zone && distance_sm <= max_value)
  {
    myservo.write(coef * (distance_sm - dead_zone));
  }
  else if (distance_sm < dead_zone)// если дистанция менее 4 см, серва в положении ноль градусов
  {
    myservo.write(0);
  }
  else
  {
    myservo.write(180);
  }
  delay(100); /* ждем 0.1 секунды,
   Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс. 
   */
     }

В общем хочу сделать так вот как тут https://www.youtube.com/watch?v=vEJSJSnEyIA ! Но у меня ничего не работает, серва как бы хочет стартануть но не может не ясно почему проблема в коде, тк по отдельности работает и сенсор и серво.
Оборудование :
MG 996R
Китайский аналог (adruino micro pro)
Cонар  HC-SR04
Питание от блока питания на макетной плате.
В общем MG 996R - на 10
Cонар  HC-SR04 - trig на 9, еcho на 8
Что сделано не так?  big_smile  Спасибо!

Неактивний

#2 2015-04-10 09:21:00

brigadir
Учасник
Зареєстрований: 2015-03-04
Повідомлень: 17

Re: Помогите исправить код - ато незнаю уже что делать...

Пораджу, як програміст smile
Постав логи після кожної дії. Наприклад,

    myservo.write(coef * (distance_sm - dead_zone));
    Serial.print("distance_sm: "); Serial.println(distance_sm);
    Serial.print("servo: "); Serial.println(coef * (distance_sm - dead_zone));

І заміни unsigned int на long - можливо проблеми з діапазоном чисел.

Неактивний

#3 2015-04-12 21:46:36

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Помогите исправить код - ато незнаю уже что делать...

Да и код можно опубликовать в читаемом виде smile

Неактивний

#4 2015-06-16 10:52:01

Саша Паскаль
Гість

Re: Помогите исправить код - ато незнаю уже что делать...

Т.к. у Вас китайський аналог сервопривода, она не поворачивается на 180°. У меня оригинальная итальянская серва, но у нее реальный диапазон 10°-170°.

#5 2015-06-16 16:33:41

Николай11
Гість

Re: Помогите исправить код - ато незнаю уже что делать...

Подскажите добрые люди! У меня на дисплее нокиа5111, пременные значения пишутся друг, на друга.

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

// Hardware SPI (faster, but must use certain hardware pins):
// SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
// MOSI is LCD DIN - this is pin 11 on an Arduino Uno
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
// Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);
// Note with hardware SPI MISO and SS pins aren't used but will still be read
// and written to during SPI transfer.  Be careful sharing these pins!

#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16


volatile int rpmcount = 0;//see http://arduino.cc/en/Reference/Volatile
int rpm = 0;
unsigned long lastmillis = 0;

void setup()   {
  Serial.begin(9600);

  // Инициализация дисплея
  display.begin();

  // Очищаем дисплей
  display.clearDisplay();
  display.display();
 
 

  // Устанавливаем контраст
  display.setContrast(50);
  delay(1000);
 
  attachInterrupt(0, rpm_fan, FALLING);//interrupt cero (0) is on pin two(2).

}
void loop() {
  if (millis() - lastmillis == 1000)
   
  detachInterrupt(0); //Disable interrupt when calculating
 
  rpm = rpmcount; /* Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use rpmcount * 30.*/

   
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.setCursor(0,0);
  display.print("RPM: ");
  display.write(rpm);
  display.setCursor(0,8);
  display.print("Hz: ");
  display.write(rpmcount)
  display.display();

 
  rpmcount = 0; // Restart the RPM counter
lastmillis = millis(); // Uptade lasmillis
attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
}


void rpm_fan(){ /* this code will be executed every time the interrupt 0 (pin2) gets low.*/
rpmcount++;
}

#6 2015-06-16 17:09:59

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Помогите исправить код - ато незнаю уже что делать...

день добрый,
что значит  "пременные значения пишутся друг, на друга"?
фотку что ли покажите )

https://github.com/adafruit/Adafruit-PC … CD8544.cpp
display.write( ) вроде перезаписывает цветом bg неиспользуемые пиксели.  )
сделайте перед выводом display.clearDisplay();

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму