Закрепление значения переменной. (х1=х, при том, что х меняется.)

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

Здравствуйте! Загорелось мне собрать трёхосевой стабилизатор для экшн-камеры, а в дальнейшем собрать его на более мощных моторах, для того, чтобы ставить на него DSLR.
Есть деревяшка, двухосевая платформочка от наших славных друзей на серводвижочках, и гироскоп GY-271.

Был сделан тестовый экземпляр. Деревяшка, внизу приклеен гироскоп, наверху платформочка.
Логика такова: Ардуина по i2c считывает x, y, и z с датчика. Пока решил разобраться с иксом. По кнопке запоминается значение х в х1. Далее считается дельта между запомненым положением, и новым. И это умножается на некоторое число, и получается угол, на который нужно повернуть серву. 

Вопрос. Как заставить по кнопке запоминать значение х? Я написал "const int x1 = x". Но если считывать информацию сериальным монитором, то х1 меняется вслед за х. Как "закрепить" значение х1?

2 вопрос. Как управлять ультрозвуковиком? И какой лучше взять в формате стаба для GoPro? (серва слишком громкая, и медленная для видео). Но это скорее вопрос железа, и буду решать его после написания кода.

P.S. И мне кажется, что я один такой долбанутый, и делаю на 271 (остальные на 521 делают)...

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Cover_Enya пишет:

Я написал "const int x1 = x". Но если считывать информацию сериальным монитором, то х1 меняется вслед за х. Как "закрепить" значение х1?

Во-первых, const тут не нужно, оно для другого.

Во-вторых, int x1 = x; это не просто присвоение значения, это объявление каждый раз новой переменной х1. Присваивается значение так: x1 = x; (без указания типа переменной).

Скетч в студию.

Logik
Offline
Зарегистрирован: 05.08.2014

Cover_Enya пишет:

 И мне кажется, что я один такой долбанутый...

Нет, не один, здесь много таких, кто считает что реально писать код не зная вообще ничего о языке программирования. Просто они долго на форуме не тусуются, потому у вас чувство одиночества.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Logik пишет:

Нет, не один, здесь много таких, кто считает что реально писать код не зная вообще ничего о языке программирования. Просто они долго на форуме не тусуются, потому у вас чувство одиночества.

зачем что-то знать о языке программирования?

можно, даже, не знать названия языка и писать рабочий код на этом языке.

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

Jeka_M пишет:

Присваивается значение так:

Мне нужно не только присвоить это значение, но его ещё и "закрепить", для того, чтобы оно не менялось вслед за х.

 

 #include <Wire.h>
 #include <Servo.h>
 #define HMC5883L_ADDR 0x1E //0011110b, I2C 7bit address of HMC5883
 const int button = 10; //назначение кнопки
 int buttonState = 0; //переменная значения кнопки и её изначальное значение
 Servo x_axis; //назначение сервы оси x
 int pos = 90; //изначальная позиция сервы
 const int servo_deg = 0.3383;
 int c; //c - глобальная переменная для градусов поворота сервы
 byte state = 0; //изначальное значение state
 
 bool haveHMC5883L = false;
 
bool detectHMC5883L ()
{
  // read identification registers
  Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
  Wire.write(10); //select Identification register A
  Wire.endTransmission();
  Wire.requestFrom(HMC5883L_ADDR, 3);
  if(3 == Wire.available()) {
    char a = Wire.read();
    char b = Wire.read();
    char c = Wire.read();
    if(a == 'H' && b == '4' && c == '3')
      return true;
  }
 
  return false;
}
 
void setup()
{
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Serial.println("GY271 TEST");
  Wire.begin();
  // lower I2C clock http://www.gammon.com.au/forum/?id=10896
  TWBR = 78;  // 25 kHz 
  TWSR |= _BV (TWPS0);  // change prescaler
  pinMode(button, INPUT);
  x_axis.attach(9);   
}
 
void loop()
{
  bool detect = detectHMC5883L();
 
  if(!haveHMC5883L) 
  {
    if(detect) 
    {
      haveHMC5883L = true;
      Serial.println("We have HMC5883L, moving on");
      // Put the HMC5883 IC into the correct operating mode
      Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
      Wire.write(0x02); //select mode register
      Wire.write(0x00); //continuous measurement mode
      Wire.endTransmission();
    }
    else
    {  
      Serial.println("No HMC5883L detected!");
      delay(2000);
      return;
    }
  }
  else
  {
    if(!detect) {
      haveHMC5883L = false;
      Serial.println("Lost connection to HMC5883L!");
      delay(2000);
      return;
    }
  }
 
  
  int x,y,z; //triple axis data
 
  //Tell the HMC5883 where to begin reading data
  Wire.beginTransmission(HMC5883L_ADDR);
  Wire.write(0x03); //select register 3, X MSB register
  Wire.endTransmission();
 
 //Read data from each axis, 2 registers per axis
  Wire.requestFrom(HMC5883L_ADDR, 6);
  if(6<=Wire.available()){
    x = Wire.read()<<8; //X msb
    x |= Wire.read(); //X lsb
    z = Wire.read()<<8; //Z msb
    z |= Wire.read(); //Z lsb
    y = Wire.read()<<8; //Y msb
    y |= Wire.read(); //Y lsb


  }
 
  boolean keyPress = digitalRead(button);
  if(keyPress){
    state++;
    delay(20);
  }

  switch(state){
  case 0:
  {
  const int x1 = x;
  Serial.print("  x1:  ");
  Serial.print(x1);
  Serial.print("  x:  ");
  Serial.print(x); //проверка на совпадение х и х1
  delay(2000); 
  }
  case 1:{
  }
  }
  /*
   Формула:
   dx = x-x1;
   c = dx*servo_deg
   Повернуть серво на с
   */

Скетч брал из примера (не оч помню откуда). Не использовал спец. библиотеку для модуля, т.к. она вообще не работала, поэтому только хардкорный скетч без спец. библиотек через I2C.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Cover_Enya пишет:

Мне нужно не только присвоить это значение, но его ещё и "закрепить"

прекращай бредить: а = 5; - никаких закреплений, порождённых твоей придурошной фантазией не нужно, что бы 'а' всегда была равна пяти, пока ты не сделаешь а = 4;

Logik
Offline
Зарегистрирован: 05.08.2014

Но  я бы всеже проверял бы:

a=5;
if(a!=5) Serial.println("Здесь требуется отдельное закрепление");

 

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

Logik пишет:

Нет, не один, здесь много таких, кто считает что реально писать код не зная вообще ничего о языке программирования. 

Мне 14. Имею представление об Arduino и саму Ardino лет с 12.
В 7 классе пошёл на кружок, где мы на Arduino производили простенькие задачи. В восьмом на информатике начали писать на питоне.
Мне нужно писать курсовую. Сейчас, в восьмом, я решил писать по DRSSTC-катушке Тесла. Во время изучения датчиков на выходных загорелся идеей сделать стаб для камеры, и написать по нему курсач уже для 9 класса.
Пока нет денег на покупку компонентов для катушки, пытаюсь разобраться со стабилизатором.

Сам написать могу только моргание лампочкой. Все же когда-то новичками были, так что не надо тут...

Logik
Offline
Зарегистрирован: 05.08.2014

ОК. Закрепление - отставить. Если присвоили переменной чего - это на века (ну т.е. до ребута ближайшего). Но откройте учебник по Си. Любой. Первые Главы - типы данных, константы, переменные, функции. Там читать на одну ночь. Без этого - никак.

ПС. Питон лишний, на нем можна немного заработать, но Вам, как будущему спецу он ниче не даст. Только задушит ;)

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

Клапауций 823 пишет:

Никаких закреплений

Дело в том, что запуская проверку, и крутя в руках модель с датчиком, х1 меняется вслед за х, чего происходить не должно.

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

Logik пишет:

Питон лишний, только задушит ;)

Насчёт этого согласен, иногда забываешь на ардуине проставлять "{} и ;", а на уроке наоборот ставишь, это ужасно раздражает)
Но для общего развитя вроде заходит 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Logik пишет:

Если присвоили переменной чего - это на века 

Охххх :)))))

Logik
Offline
Зарегистрирован: 05.08.2014

а чего так цитату на полуслове обрывать?

///....(ну т.е. до ребута ближайшего)

:))))

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Logik пишет:

(ну т.е. до ребута ближайшего)

запрещаю ребут - теперь всё будет отлито в граните на века

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Во дела, до этого жаловались что переменная не обновляется, теперь отвезать не могут)
Если по делу то у Вас скетч работает не правильно, в блоке switch х1 почему то с констатной постоянно приравнивается к х пока не нажата кнопка, когда кнопка нажата ничего уже не происхрдит и вернуть ничего нельзя.
Вы наверное не понимаете что все действия ардуинка как и положено выполняет последовательно, а не все сеопом
У вас присвоение х1=х должно быть когда нажата кнопка.
По поводу выбора движетелей все хорошие стабилизаторы работают на бесколлекторных моторах, не на абы каких а с низким kv. На сервах это хардкор.

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

Mr.Privet пишет:
У вас присвоение х1=х должно быть когда нажата кнопка.

Получается, что:

#define button = 10;
~
int buttonstate = digitalRead(button);
if (buttonstate == high, HIGH){
int x1 = x;
delay 20; //дребезг
}
else 
{ Serial.print (" x: ");
Serial.print(x);
Serial.print("  1x: ");
Serial.print(x1); //Проверка на совпадение
Serial.print("\n");
delay(1000);}

Правильно же?

Mr.Privet пишет:
На сервах это хардкор.

На сервах тестовый вариант проверить как работает, и работает ли вообще

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Cover_Enya пишет:

#define button = 10;
~
int buttonstate = digitalRead(button);
if (buttonstate == high, HIGH){
int x1 = x;
delay 20; //дребезг
}
else 
{ Serial.print (" x: ");
Serial.print(x);
Serial.print("  1x: ");
Serial.print(x1); //Проверка на совпадение
Serial.print("\n");
delay(1000);}

Правильно же?

А самому запустить и попробовать не судьба? Хотя бы просто компиляцию запустить религия не позволила или Клапауций запретил? Почему кто-то должен за Вас это делать?

Строка 4:
1) надеюсь, у Вас есть описанная переменная "high", если нет, то, если бы Вы не поленились запустить компиляцию, компилятор бы Вам об этом сказал;
2) опять жа надеюсь, что Вы понимаете, что означает записанная в этой строке конструкция.

Строка 5
1) нахрена здесь описана переменная х1, которая нигде и никогда не используется? и если бы Вы не поленились запустить компиляцию, компилятор бы Вам об этом сказал

Строка 12
1) в этой строке используется переменная х1, которая нигде не описана. Если бы Вы не поленились запустить компиляцию, компилятор бы Вам об этом сказал (или она описана в той части кода, которую Вы скрыли от нас?)

Замечание: если Вы считаете, что в строке 12 используется та самая переменная х1, которая описана в строке 5, то таки нет - это совершенно разные переменные. Читайте про "области видимости" вот здесь до полного просветления.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Да, пишите весь скетч, а не отдельный кусок. У Вас клментарий "проверка на совпадение" что вообще значит? Вот вам скелет
//Дефайны
//Инициация глобалов (здесь прописываем все переменные с. Int, boolean итд, смотрим типы переменных)
// блок setup (здесь включаем сириал если он нужен, настраиваем пины на вход и выход)
// луп ( этот цыкл крутится вечно (если вовремя заменить батарейки))
// чтаем угол наклона, сохраняем в х ( х у нас глобальная)
// смотрим состояния кнопки, если нажата то приравниваем х1 к х ( х1му нас тоже должна была быть уже инициирована в глобалах)
// сверяем х и х1, если есть разница двигаем сервой в нужную сторону на нужный угол.

Теперь скопируйте этот скелет в ide и пропишите каждый этап, результат скиньте сюда, будем разбираться.

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

ЕвгенийП пишет:

Надеюсь, у Вас есть описанная переменная "high"

Это не переменная, а состояние, я опечатался

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Cover_Enya пишет:

ЕвгенийП пишет:

Надеюсь, у Вас есть описанная переменная "high"

Это не переменная, а состояние, я опечатался


Тогдв нужно кричать громче "HIGH"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Cover_Enya пишет:

Это не переменная, а состояние

Замечательно. Теперь подумайте о моём втором замечании к этой строке. Вы действительно понимаете, что там написано?
 

Cover_Enya пишет:

я опечатался

Если бы Вы не поленились запустить компиляцию .... (далее по тексту)

Cover_Enya
Offline
Зарегистрирован: 16.06.2016
#include <Wire.h>
 #include <Servo.h>
 #define HMC5883L_ADDR 0x1E //0011110b, I2C 7bit address of HMC5883
 const int buttonPin = 10; //дефайним кнопку
 int buttonState = 0; //переменная значения кнопки и её изначальное значение
 Servo x_axis; //назначение сервы оси x
 int pos = 90; //изначальная позиция сервы
 const int servo_deg = 0.3383;
 int c; //c - глобальная переменная для градусов поворота сервы
 byte state = 0; //изначальное значение state
 int dx; //дельта х и х1
 int x1; //фиксированое положение
 
 bool haveHMC5883L = false;
 
bool detectHMC5883L ()
{
  // read identification registers
  Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
  Wire.write(10); //select Identification register A
  Wire.endTransmission();
  Wire.requestFrom(HMC5883L_ADDR, 3);
  if(3 == Wire.available()) {
    char a = Wire.read();
    char b = Wire.read();
    char c = Wire.read();
    if(a == 'H' && b == '4' && c == '3')
      return true;
  }
 
  return false;
}
 
void setup()
{
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Serial.println("GY271 TEST");
  Wire.begin();
  // lower I2C clock http://www.gammon.com.au/forum/?id=10896
  TWBR = 78;  // 25 kHz 
  TWSR |= _BV (TWPS0);  // change prescaler
  pinMode(buttonPin, INPUT);
  x_axis.attach(9);   
}
 
void loop()
{
  bool detect = detectHMC5883L();
 
  if(!haveHMC5883L) 
  {
    if(detect) 
    {
      haveHMC5883L = true;
      Serial.println("We have HMC5883L, moving on");
      // Put the HMC5883 IC into the correct operating mode
      Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
      Wire.write(0x02); //select mode register
      Wire.write(0x00); //continuous measurement mode
      Wire.endTransmission();
    }
    else
    {  
      Serial.println("No HMC5883L detected!");
      delay(2000);
      return;
    }
  }
  else
  {
    if(!detect) {
      haveHMC5883L = false;
      Serial.println("Lost connection to HMC5883L!");
      delay(2000);
      return;
    }
  }
 
  
  int x,y,z; //triple axis data
 
  //Tell the HMC5883 where to begin reading data
  Wire.beginTransmission(HMC5883L_ADDR);
  Wire.write(0x03); //select register 3, X MSB register
  Wire.endTransmission();
 
 //Read data from each axis, 2 registers per axis
  Wire.requestFrom(HMC5883L_ADDR, 6);
  if(6<=Wire.available()){
    x = Wire.read()<<8; //X msb
    x |= Wire.read(); //X lsb
    z = Wire.read()<<8; //Z msb
    z |= Wire.read(); //Z lsb
    y = Wire.read()<<8; //Y msb
    y |= Wire.read(); //Y lsb
    }
  
  int buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH){
    x1 = x;
    delay(20); //нет-дребезгу 
  }
  else
  {int dx;
  dx = x - x1;
  c = dx*servo_deg;
  Serial.print(" x:  ");
  Serial.print(x);
  Serial.print(" x1:  ");
  Serial.print(x1);
  Serial.print(" dx:  ");
  Serial.print(dx);
  Serial.print(" c:  ");
  Serial.print(c);
  Serial.print("\n");
  delay(500);
  }
 }

Примерно вот. Компилятор всё радостно и молча схавал. Проверить сам скетч смогу дома только. Не хочется таскать с собой разваливающийся прототип

Прототип

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

Mr.Privet пишет:

Тогда нужно кричать громче "HIGH"

Я и крикнул, сначала "high", потом "HIGH"))
Не проснулся)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Cover_Enya пишет:
Компилятор всё радостно и молча схавал.

Надюсь, Вы понимаете. что написано в строке 8?

Если понимаете, то зачем писали так сложно? Почему просто не написать:

const int servo_deg = 0;

?

Cover_Enya
Offline
Зарегистрирован: 16.06.2016

ЕвгенийП пишет:

Надюсь, Вы понимаете. что написано в строке 8?

Почему просто не написать:

const int servo_deg = 0;

?

серва должна поворачиваться на 600 градусов?? число 0,3.. было выведено путём расчётов положений

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Cover_Enya пишет:

серва должна поворачиваться на 600 градусов?? число 0,3.. было выведено путём расчётов положений

Это глубоко Ваша проблема. Если бы Вы внимательно прочитали мой пост, то поняли бы, что то, что у Вас написано

 const int servo_deg = 0.3383;

абсолютно идентично такому

const int servo_deg = 0;

Вы именно это хотели написать? Чтобы там 0 был? Если нет - исправляйте ошибку.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Подсказка -int это целочисленный тип переменных