Servo.h обёрнутый в другой CLASS не работает.

ich
Offline
Зарегистрирован: 10.06.2012

Хотел написать один единственный класс в котором все мне нужные функции и объекты уже созданны.

Начал с библиотеки Servo.h вот что написал для начало.

#include "Arduino_Robot.h"
#include "lib/Steuerung.h"

Steuerung robot;

void setup()
{

}

void loop()
{
	robot.stap();
	delay(1000);
}
/*
 * Steuerung.h
 *
 *  Created on: 14.10.2012
 *      Author: Ich
 */

#ifndef STEUERUNG_H_
#define STEUERUNG_H_
#include "Arduino.h"
#include "Servo.h"

class Steuerung {
public:
	Steuerung();
	void blink();
	void stap();
	Servo servo;
	int pos;
};

#endif /* STEUERUNG_H_ */
/*
 * Steuerung.cpp
 *
 *  Created on: 14.10.2012
 *      Author: Ich
 */
#include "Arduino.h"
#include "Steuerung.h"

Steuerung::Steuerung() {
	servo.attach(12);
	pinMode(13, OUTPUT);
	pos = 0;
}

void Steuerung::blink(){
	digitalWrite(13, !digitalRead(13));
}

void Steuerung::stap(){
	servo.write(pos);
	pos += 10;
	if(pos>180){
		pos=0;
	}
	blink();
}

Вообщем всё просто. Но стоит скомпелировать и загрузить этот код в ардуину, серво сразу встаёт колом, не двигается и наченает ужасно греться. А должна каждую секунду поворачиваться на 10°.

Если делаю без моего класса, т.е. сразу в Arduino_Robot.cpp то всё работает.

Как запокавать библиотеку Servo в свой класс?

Adno
Offline
Зарегистрирован: 21.09.2012

Надо наследовать класс servo

вот здесь я случайно писал про наследование
http://arduino.ru/forum/obshchii/pro-arduino-ide

ich
Offline
Зарегистрирован: 10.06.2012

Надо попробывать. Только вот я не понимаю, почему создание Объекта Servo в другом классе приводт к таким последствиям. На сколько мне позволяют мои знания JAVA, это не должно влиять на работу объекта.

Может быть это каким-то оброзом связанно с таймерами? Кто-нибудь уже сталкивался с подобной проблемой?

Adno
Offline
Зарегистрирован: 21.09.2012

Я думаю это нарушение идеологии С++;
Как бы, какой смысл создавать объект в классе, когда можно сразу получить класс со свойствами этого объекта 8=)

ich
Offline
Зарегистрирован: 10.06.2012

А если я надумаю в новом классе создать несколько объектов и там ими манипулировать?

Например так:

class Shassi{
  Servo left;
  Servo right;

  void forward(){
   left.write(180);
   right.write(0);
  }
 
  void backward(){
   left.write(0);
   right.write(180);
  }
}

 

Как быть тогда? Где смысл идиологии?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

ich пишет:

 

Как быть тогда? Где смысл идиологии?

Вы невнимательно прочитали постпро наследование. И неплохо бы почитать о наследовании в с++ вообще (в теории то биш)

ich
Offline
Зарегистрирован: 10.06.2012

Что такое "наследование" я знаю, в C++ оно не силно отлечается от JAVA. Один, два плюса и то не факт что плюса.

Топик я читал внемательно и решение своей проблемы не нашол. Как я уже выше писал:

ich пишет:

А если я надумаю в новом классе создать несколько объектов и там ими манипулировать?

Например так:

class Shassi{
  Servo left;
  Servo right;

  void forward(){
   left.write(180);
   right.write(0);
  }
 
  void backward(){
   left.write(0);
   right.write(180);
  }
}

 

Как быть тогда? Где смысл идиологии?

Я не думаю что вот такое изменения спасёт меня:

class Shassi: public Servo{ ... 

Или я ошибаюсь? Если ошибаюсь, то простите пожалуста и если не трудно дайте ссылку на описание "наследования" с помощью которого можно решить мою проблему. А то все те статьи которые мне предлогает google не чего стоющего по моей проблеме не содержат.

Adno
Offline
Зарегистрирован: 21.09.2012

ich пишет:

class Shassi: public Servo{ ... 

Или я ошибаюсь?


Здесь вы потеряете вашу логическую структуру данных 8=)
Shassi прийдётся оформить отдельным окном-модулем и в нём завести два класса

class Left: public Servo
class Right:public Servo 

А ещё лучше завести "массив" классов, виртуальный "надкласс", тогда всё это можно будет обрабатывать в цикле одинаковой процедурой...
Что-то типа

virtual class Shassi: public Servo
class Left:public Shassi 
class Right:public Shassi

То есть далее работаем со всем объектами типа Shassi в однообразном цикле
я уже забыл как, лет 5 не занимался C++. Помню только, что там использовался индекс с модификатором static, как бы общий и доступный всем созданным наследникам виртуального класса. Насколько это, в том числе и виртуальные функции, доступны в Arduino, не знаю
Извините, что отвечаю поверхностно, с ходу, без надлежащего углубления в проблему.

ich
Offline
Зарегистрирован: 10.06.2012

Adno пишет:

А ещё лучше завести "массив" классов, виртуальный "надкласс", тогда всё это можно будет обрабатывать в цикле одинаковой процедурой... Что-то типа

Что такое "надкласс" и как его создать? И как это должно выглядеть в массиве?