Tinkerkit Programm Start ohne Zurücksetzung auf die Sicherheits Stellung

OIP
I have a small problem that I can't solve. I plan to write a program for an open day that will give people a candy when I start it. Unfortunately, he goes into a (see picture) similar posture at program start. And I don't want him to do that.

That's the code I'm using
(ich habe ein kleines Problem welches ich nicht lösen kann. ich habe vor für einen tag der offenen Tür ein programm zu schreiben was leuten einen bonbon gibt wen ich es starte. leider Geht er bei Programm Start in eine (siehe Bild) ähnliche haltung. und ich will das er dies nicht tut.)

das ist der code den ich verwende

#include <Braccio.h>
#include <Servo.h>
Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_ver;
Servo wrist_rot;
Servo gripper;
void setup() {
  Braccio.begin();
                      //(step delay  M1, M2,  M3,  M4,  M5, M6);
 Braccio.ServoMovement(20,            0, 90,  90,  80,  0, 10);
 delay(1000);
 Braccio.ServoMovement(20,           90, 90,  90,  80,  0, 10);
 Braccio.ServoMovement(9000,         95, 34,  66,  10,  100, 10);
 delay(1000);
 Braccio.ServoMovement(9000,         95, 34,  66,  10,  100, 70);
 delay(1500);
 Braccio.ServoMovement(9000,         95, 34,  66,  10,  100, 72);
 delay(1500);
 Braccio.ServoMovement(9000,         95, 149,  90,  103,  100, 72);
 delay(1000);
 Braccio.ServoMovement(9000,         95, 149,  90,  103,  100, 10);
 Braccio.ServoMovement(20,          0,   90,  90,   80,    0, 10);
 Braccio.ServoMovement(20,          0,   90,  90,   45,    0, 10);
 Braccio.ServoMovement(20,          0,   90,  90,   135,    0, 10);
 Braccio.ServoMovement(20,          0,   90,  90,   80,    0, 10);

}
void loop() {

}

Unfortunately I'm not that gifted at coding, so I'm asking for some simple help :wink:
(leider bin ich nicht so begabt im coden deshalb bitte ich um eine einfache hilfe :wink:)

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

wurde übersetzt in englisch

Bitte gehe in den Post mit dem Bleistiftsymbol.
Dann markiere nur den kompletten Codeteil, und klicke oben auf den Button <code> im Editor. Dann wieder speichern.

Ich kann Dir aber schon den Zahn ziehen, dass das für Dich einfach wird, Dein Problem zu lösen.

Das Problem liegt hier:

Mit dem .begin() erfolgt eine Initialisierung der variablen und des gesamtem Roboters.

Da nicht bekannt ist, wo und wie der Arm steht, wird ein definierter Ausgangspunkt angefahren.

ICH Würde das Ding einfach stehen lassen und auf einen Tastendruck die Position zum Bonbin holen und danach die Position zum Bonbon geben anfahren.
danach ist die Statemachine am Ende und wartet auf einen neuen Tastendruck.
Lässt sich mit deinem Code reltiv schnell und unkompliziert erledigen.

1 Like

Jetzt darfst du wider Deutsch schreiben der Mod hat dich "verschoben":wink:

Zeichne ein Bild von der Position, an der der Roboter sein soll.

  1. Draw a picture of how you want the robot to be positioned.
  2. Learn what each "Braccio" movement does.
  3. Give a name to each "Braccio" movement, for example this might drop the candy, so:
Braccio.ServoMovement(20, 0, 90, 90, 80, 0, 10);

could be in a function,

void dropCandy() {
  Braccio.ServoMovement(20, 0, 90, 90, 80, 0, 10);
}

and you would call it from loop() like this...

void loop() {
  dropCandy();
}

Then put your new functions together:

void loop() {
  gotoCandy();
  grabCandy();
  liftCandy();
  facePerson();
  moveToPerson();
  dropCandy();
}

AND... the functions have "delay" in the parameters, so delay() is not necessary

delay(1000); // not necessary
Braccio.ServoMovement(9000, 95, 149, 90, 103, 100, 10); // 9000 is 9 seconds delay

Und so wieder...

1 Like

Das löst sein Problem nicht. Er möchte den Arduino mit Strom versorgen und der arm soll nicht während der initialisierung in Grundstellung fahren
.

Sie sagen, ich sollte nur Lösungen posten und keine Schritte mit Anweisungen? Mein Ziel war es, ihm zu helfen, die Position zu finden, die er beim Startup haben möchte. Anderen zu sagen, dass sie nicht helfen sollen, ist keine Lösung.

Du hast das Problem nicht verstanden.
Während des init fährt der arm in eine Grundstellung.
Das möchte der to nicht.

Nein. Aber ich habe gekündigt.

ja genau die Grundeinstellung ist das Problem und mir ist aufgefallen das ich das nicht mit meinem Code ändern kann da ich eine Bibliothek nutze und dort alles vorgeschrieben ist.
das ist der Code der in der Bibliothek ist:


/*
 Braccio.cpp - board library Version 2.0
 Written by Andrea Martino and Angelo Ferrante

 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include "Braccio.h"

extern Servo base;
extern Servo shoulder;
extern Servo elbow;
extern Servo wrist_rot;
extern Servo wrist_ver;
extern Servo gripper;

extern int step_base = 0;
extern int step_shoulder = 45;
extern int step_elbow = 180;
extern int step_wrist_rot = 180;
extern int step_wrist_ver = 90;
extern int step_gripper = 10;
 

_Braccio Braccio;

//Initialize Braccio object
_Braccio::_Braccio() {
}

/**
 * Braccio initialization and set intial position
 * Modifing this function you can set up the initial position of all the
 * servo motors of Braccio
 * @param soft_start_level: default value is 0 (SOFT_START_DEFAULT)
 * You should set begin(SOFT_START_DISABLED) if you are using the Arm Robot shield V1.6
 * SOFT_START_DISABLED disable the Braccio movements
 */
unsigned int _Braccio::begin(int soft_start_level) {
	//Calling Braccio.begin(SOFT_START_DISABLED) the Softstart is disabled and you can use the pin 12
	if(soft_start_level!=SOFT_START_DISABLED){
		pinMode(SOFT_START_CONTROL_PIN,OUTPUT);
		digitalWrite(SOFT_START_CONTROL_PIN,LOW);
	}

	// initialization pin Servo motors
	base.attach(11);
	shoulder.attach(10);
	elbow.attach(9);
	wrist_rot.attach(6);
	wrist_ver.attach(5);
	gripper.attach(3);
        
	//For each step motor this set up the initial degree
	base.write(0);
	shoulder.write(40);
	elbow.write(180);
	wrist_ver.write(170);
	wrist_rot.write(0);
	gripper.write(73);
	//Previous step motor position
	step_base = 0;
	step_shoulder = 40;
	step_elbow = 180;
	step_wrist_ver = 170;
	step_wrist_rot = 0;
	step_gripper = 73;

	if(soft_start_level!=SOFT_START_DISABLED)
    		_softStart(soft_start_level);
	return 1;
}

/*
Software implementation of the PWM for the SOFT_START_CONTROL_PIN,HIGH
@param high_time: the time in the logic level high
@param low_time: the time in the logic level low
*/
void _Braccio::_softwarePWM(int high_time, int low_time){
	digitalWrite(SOFT_START_CONTROL_PIN,HIGH);
	delayMicroseconds(high_time);
	digitalWrite(SOFT_START_CONTROL_PIN,LOW);
	delayMicroseconds(low_time); 
}

/*
* This function, used only with the Braccio Shield V4 and greater,
* turn ON the Braccio softly and save it from brokes.
* The SOFT_START_CONTROL_PIN is used as a software PWM
* @param soft_start_level: the minimum value is -70, default value is 0 (SOFT_START_DEFAULT)
*/
void _Braccio::_softStart(int soft_start_level){      
	long int tmp=millis();
	while(millis()-tmp < LOW_LIMIT_TIMEOUT)
		_softwarePWM(80+soft_start_level, 450 - soft_start_level);   //the sum should be 530usec	

	while(millis()-tmp < HIGH_LIMIT_TIMEOUT)
		_softwarePWM(75 + soft_start_level, 430 - soft_start_level); //the sum should be 505usec

	digitalWrite(SOFT_START_CONTROL_PIN,HIGH);
}

/**
 * This functions allow you to control all the servo motors
 * 
 * @param stepDelay The delay between each servo movement
 * @param vBase next base servo motor degree
 * @param vShoulder next shoulder servo motor degree
 * @param vElbow next elbow servo motor degree
 * @param vWrist_ver next wrist rotation servo motor degree
 * @param vWrist_rot next wrist vertical servo motor degree
 * @param vgripper next gripper servo motor degree
 */
int _Braccio::ServoMovement(int stepDelay, int vBase, int vShoulder, int vElbow,int vWrist_ver, int vWrist_rot, int vgripper) {

	// Check values, to avoid dangerous positions for the Braccio
    	if (stepDelay > 30) stepDelay = 30;
	if (stepDelay < 10) stepDelay = 10;
	if (vBase < 0) vBase=0;
	if (vBase > 180) vBase=180;
	if (vShoulder < 15) vShoulder=15;
	if (vShoulder > 165) vShoulder=165;
	if (vElbow < 0) vElbow=0;
	if (vElbow > 180) vElbow=180;
	if (vWrist_ver < 0) vWrist_ver=0;
	if (vWrist_ver > 180) vWrist_ver=180;
	if (vWrist_rot > 180) vWrist_rot=180;
	if (vWrist_rot < 0) vWrist_rot=0;
    	if (vgripper < 10) vgripper = 10;
	if (vgripper > 73) vgripper = 73;

	int exit = 1;

	//Until the all motors are in the desired position
	while (exit) 
	{			
		//For each servo motor if next degree is not the same of the previuos than do the movement		
		if (vBase != step_base) 
		{			
			base.write(step_base);
			//One step ahead
			if (vBase > step_base) {
				step_base++;
			}
			//One step beyond
			if (vBase < step_base) {
				step_base--;
			}
		}

		if (vShoulder != step_shoulder)  
		{
			shoulder.write(step_shoulder);
			//One step ahead
			if (vShoulder > step_shoulder) {
				step_shoulder++;
			}
			//One step beyond
			if (vShoulder < step_shoulder) {
				step_shoulder--;
			}

		}

		if (vElbow != step_elbow)  
		{
			elbow.write(step_elbow);
			//One step ahead
			if (vElbow > step_elbow) {
				step_elbow++;
			}
			//One step beyond
			if (vElbow < step_elbow) {
				step_elbow--;
			}

		}

		if (vWrist_ver != step_wrist_rot) 
		{
			wrist_rot.write(step_wrist_rot);
			//One step ahead
			if (vWrist_ver > step_wrist_rot) {
				step_wrist_rot++;				
			}
			//One step beyond
			if (vWrist_ver < step_wrist_rot) {
				step_wrist_rot--;
			}

		}

		if (vWrist_rot != step_wrist_ver)
		{
			wrist_ver.write(step_wrist_ver);
			//One step ahead
			if (vWrist_rot > step_wrist_ver) {
				step_wrist_ver++;
			}
			//One step beyond
			if (vWrist_rot < step_wrist_ver) {
				step_wrist_ver--;
			}
		}

		if (vgripper != step_gripper)
		{
			gripper.write(step_gripper);
			if (vgripper > step_gripper) {
				step_gripper++;
			}
			//One step beyond
			if (vgripper < step_gripper) {
				step_gripper--;
			}
		}
		
		//delay between each movement
		delay(stepDelay);
		
		//It checks if all the servo motors are in the desired position 
		if ((vBase == step_base) && (vShoulder == step_shoulder)
				&& (vElbow == step_elbow) && (vWrist_ver == step_wrist_rot)
				&& (vWrist_rot == step_wrist_ver) && (vgripper == step_gripper)) {
			step_base = vBase;
			step_shoulder = vShoulder;
			step_elbow = vElbow;
			step_wrist_rot = vWrist_ver;
			step_wrist_ver = vWrist_rot;
			step_gripper = vgripper;
			exit = 0;
		} else {
			exit = 1;
		}
	}
}

und das ist auch noch ein anderer

/*
  Braccio.h - board library Version 2.0
  Written by Andrea Martino and Angelo Ferrante

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef BRACCIO_H_
#define BRACCIO_H_

#include <Arduino.h>
#include <Servo.h>

// You should set begin(SOFT_START_DISABLED) if you are using the Arm Robot shield V1.6
#define SOFT_START_DISABLED		-999

//The default value for the soft start
#define SOFT_START_DEFAULT		0

//The software PWM is connected to PIN 12. You cannot use the pin 12 if you are using
//a Braccio shield V4 or newer
#define SOFT_START_CONTROL_PIN	12

//Low and High Limit Timeout for the Software PWM
#define LOW_LIMIT_TIMEOUT 2000
#define HIGH_LIMIT_TIMEOUT 6000

class _Braccio {

public:
  _Braccio();
  	
  /**
  * Braccio initializations and set intial position
  * Modifing this function you can set up the initial position of all the
  * servo motors of Braccio 
  *@param soft_start_level: the minimum value is -70, default value is 0 (SOFT_START_DEFAULT)
  * You should set begin(SOFT_START_DISABLED) if you are using the Arm Robot shield V1.6
  */
  unsigned int begin(int soft_start_level=SOFT_START_DEFAULT); 

  /**
   * This function allow the user to control all the servo motors in the Braccio
   */
  int ServoMovement(int delay, int Vbase,int Vshoulder, int Velbow, int Vwrist_ver, int Vwrist_rot, int Vgripper); 
	

private:
  /*
  * This function, used only with the Braccio Shield V4 and greater,
  * turn ON the Braccio softly and save Braccio from brokes.
  * The SOFT_START_CONTROL_PIN is used as a software PWM
  * @param soft_start_level: the minimum value is -70, , default value is 0 (SOFT_START_DEFAULT)
  */
  void _softStart(int soft_start_level);
	
  /*
  * Software implementation of the PWM for the SOFT_START_CONTROL_PIN,HIGH
  * @param high_time: the time in the logic level high
  * @param low_time: the time in the logic level low
  */
  void _softwarePWM(int high_time, int low_time);


};

extern _Braccio Braccio;

#endif // BRACCIO_H_

vorab ist nicht selbstgeschrieben sondern runtergeladen über den library manager auf Arduino Name Braccio von andrea martino

Vielen dank im vorraus

und danke an alle die bis jetzt versucht haben zu helfen

die Funktion heist soft Start

Ich kann Dir nur nochmals meine Lösung empfehlen und nicht den Arduino ganz abschalten und neu starten, sondern einmal starten und den Schalter an einen PIN des Arduino anschliessen und dann im loop() die Ausführung damit anhalten.

Ob ich eine Kopie der lib anlegen und die dann verändern würde, muss ich noch drüber nachdenken.
Machbar wäre das möglicherweise, aber der Aufwand rechtfertigt den Einsatz - wegen der bekannten Alternative - nicht wirklich.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.