PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Control + SD20 Testprogramm !!



PabloEscoba
10.02.2007, 15:47
Hallo

Ich wollte mal Fragen ob jemand eine Art TestProgramm hat für die steuerung eines Servos (C-Control und SD20).
Am besten wäre es wenn man die c-control direkt über den Pc ansteuern könnte und so die winkelstellung beeinflussen.Z.BSp mit einem Schieberegler oder auch durch direkte eingabe von Zahlen (0-255)
Ich bräuchte in jedem fall beide Codes die für die C-Control und die für den Pc (VB oder C++).
Ich denke das wäre für viele Anfänger eine grosse Hilfe die wie ich erstmall ein passendes Servo suchen bzw das servo hacken wollen.
Desweiteren kann man bestimmt das ganze besser nachvolziehen und daraus lernen wenn man diese Möglichkeit hat.Falls keiner so ein TestProgramm in der Schublade hat wäre es natürlich extrem cool wenn einer der zahlreichen Profis hier die Zeit und die lust hat eins zu schreiben.
Bin in jedem Fall für alle Infos dankbar !!

H.M

Drifter2006
10.02.2007, 19:05
Hello,
I found this -> https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=17402&highlight=sd20
This could be a start.
Greetings,
Drifter2006

nighteagle
23.07.2007, 23:06
Moin!

Also ich habe mal mein alte CControl 1 Unit rausgeholt und mit dem SD20 das angegebene Testprogramm compiliert und übertragen. Also irgendwie stimmt da was nicht mit den Impulslängen?? Denn das Servo läuft zwar in die soll-Position aber bei einer Schleife in der es hin und her laufen soll, mit Pause 100 nach erster Position und Pause 100 nach zweiter Position, scheint es so, als ob es zwei Bewegungen in einer durchführt.. wie ein verspäteter Impuls.. allerdings völligt unregelmässig... Auch andere Servos zeigen diese Verhalten. Woran könnte das liegen? Dies ist nur bei einahme von Position 0 zu 255 umgekehrt zeigt das Servo diese Verhalten niemals??

Suggarman
24.07.2007, 12:43
Ich denke das wäre für viele Anfänger eine grosse Hilfe die wie ich erstmall ein passendes Servo suchen bzw das servo hacken wollen.


Zerhackt doch nicht immer eure Servos :-)
Die C-Control, bzw. der SD20 ist doch in der Lage jedes handelsübliche Servo anzusteuern.

mfg

Stefan

nighteagle
24.07.2007, 15:11
Hier mal das Testprogramm mit Servos an 1 und 3, jeweils hin und herpendeln von Position 0 bis 255. wie gesagt der erste abschnitt sorgt dafür das die Servos immer doppelte Bewegung in einer ausführt was sich durch ein winziges unterbrechen der Fahrt sowie einen größeren Stellwinkel bemerkbar macht. Aber nur manchmal. In diesem übersteuerten Bereich hat es auch keine wirkliche Kraft... als ob es ein verspätetes Echo der Signale mit anderer Pulsweite wäre, warum habe ich eigentlich noch keinen Oscar???. Spannungversorgung der Servo ist es nicht, abgesehen davon habe ich mikroservos daran. Vielleicht die Abschlußwiderstände des I2C-Bus... ??? Stimmt da müssten doch bei der C-Control welche rein? Weiss jemand wie das nochmal war? Also nutze Port 7 und 8 der C-Control 1

mfg



[define SDA Port[7]
define SCL Port[8]

define I2C_Daten byte
define N byte 'Schleifenvariable
define Startbyte byte
define Kommandobyte byte
define ServoNummer byte
define ServoWinkel byte

'I2C Bus Ruhezustand
SDA=ON
SCL=ON

'*********** Hauptprogramm********************************
#Main


gosub I2C_Start ' I2C-Startbedingung
I2C_Daten=194 ' Adresse des SD20 am I2C Bus
gosub I2C_Write ' Adresse übertragen
I2C_Daten = 3' Register des Servos, der angesprochen werden soll schreiben
gosub I2C_Write ' Register übertragen
I2C_Daten = 0' Winkel auf den dieser Servo drehen soll schreiben
gosub I2C_Write ' Winkel schreiben
gosub I2C_Stop ' I2C-Stopbedingung.

gosub I2C_Start ' I2C-Startbedingung
I2C_Daten=194 ' Adresse des SD20 am I2C Bus
gosub I2C_Write ' Adresse übertragen
I2C_Daten = 1' Register des Servos, der angesprochen werden soll schreiben
gosub I2C_Write ' Register übertragen
I2C_Daten = 255' Winkel auf den dieser Servo drehen soll schreiben
gosub I2C_Write ' Winkel schreiben
gosub I2C_Stop ' I2C-Stopbedingung.

pause 100

gosub I2C_Start ' I2C-Startbedingung
I2C_Daten=194 ' Adresse des SD20 am I2C Bus
gosub I2C_Write ' Adresse übertragen
I2C_Daten = 3' Register des Servos, der angesprochen werden soll schreiben
gosub I2C_Write ' Register übertragen
I2C_Daten = 255' Winkel auf den dieser Servo drehen soll schreiben
gosub I2C_Write ' Winkel schreiben
gosub I2C_Stop ' I2C-Stopbedingung.

gosub I2C_Start ' I2C-Startbedingung
I2C_Daten=194 ' Adresse des SD20 am I2C Bus
gosub I2C_Write ' Adresse übertragen
I2C_Daten = 1' Register des Servos, der angesprochen werden soll schreiben
gosub I2C_Write ' Register übertragen
I2C_Daten = 0' Winkel auf den dieser Servo drehen soll schreiben
gosub I2C_Write ' Winkel schreiben
gosub I2C_Stop ' I2C-Stopbedingung.

pause 100





'*********** I2C Bus Standard Routinen********************

#I2C_Start
SDA=OFF
SCL=OFF
return

#I2C_Stop
SDA=OFF
SCL=ON
SDA=ON
return

#I2C_Write
for N=1 to 8 ' 8 Bit schreiben in For-Next-Schleife
SDA=OFF
if (I2C_Daten and 128) =128 then SDA=ON
pulse SCL
I2C_Daten=I2C_Daten shl 1
next
pulse SCL
Return

#I2C_Read
I2C_Daten=0
deact SDA
for n=1 to 8 ' 8 Bit lesen in For-Next-Schleife
I2C_Daten=I2C_Daten shl 1
SCL=ON
if SDA then I2C_Daten=I2C_Daten+1
SCL=OFF
next
Return

#Ack
SDA=0
pulse SCL
return

#NoAck
SDA=1
pulse SCL
return
][/code]

Suggarman
24.07.2007, 16:23
Hallo,
setze doch testweise mal 10k von beiden Leitungen auf 5V.
Im Programm wird die Zuweisung "=0" und "=1" benutzt. Dies sollte "off" und "on" heissen.

mfg

Stefan

nighteagle
24.07.2007, 19:28
Ja genau das wars... ich Blödian... ohne die Resistors gehts ja nicht auf dem Bus...

So jetzt laufen beide in die richtige Position und keine Echos mehr...

Aber.. jetzt muss ich mich mal mit der Basic-Programmierung beschäftigen...
Denn jetzt bemerke ich das, das Servo an Kanal 1 ja im Programm als zweites seine Daten vom sd20 bekommt.
Und hier gibt es ein Problem.. Manchmal wird dieses ausgelassen???.
Da war doch irgendwas mit der Ruhezeit bevor der SD 20 wieder das nächste Servo ansteuert?
Also für Servo an Kanal 3: i2cstart dann Adresse und Byte 1 und Byte 2 und i2cstop... und dann musste man doch eine Wartezeit einbauen??? und dann für Servo an Kanal 1: wieder i2cstart dann Adresse ... etc?

Allerdings bringt auch eine Pause von 10 zwischen den Blöcken nichts?

Hmm jetzt habe ich mal die Graupner Microservos gegen Conrad-Modelle getauscht... da gibt es das Problem anscheinend nicht???????


Auch die anderen Graupner-Mikroservos zeigen, das Sie manchmal die Befehle nicht bekommen?????

Ob es da Unterschiede gibt?? Sollte ja bei Graupner nicht sein... eher wohl beim großen C und nicht umgekehrt?

nighteagle

Drifter2006
24.07.2007, 20:44
Hello nighteagle,
I have looked through the *I2C Bus Standard Routinen* and I must say that I am not very impressed.
The *I2C Bus Standard Routinen* does not support I2C clock stretching and I2C Nack.
This “could” be the reason why you are having problems controlling your servos.
Try the download “SD20 VIA EMULATED I2C BUS b1.0 for CCIMainU1.1 with CCISB.bas” here - > https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=17402&highlight=sd20 and see if this works.
Greetings,
Drifter2006

nighteagle
24.07.2007, 21:08
Hi there,

oh good... but have any problems with your program, its not working?
I use port 7 and 8 for sda and scl, i have change it in your programm and the print function on the starter board is deleted.. Hmm where the malfuncion?

thanx

Simple Programm



'**************** I/O PORTS ****************'
define sda port[7]
define scl port[8]
'*******************************************'
'**************** A/D PORTS ****************'

'*******************************************'
'**************** D/A PORTS ****************'

'*******************************************'
'**************** VARIABLES ****************'
define control_flags byte[1]
define i2c_nack bit[1]
define i2c_last bit[2]
define i2c_nack_count byte[2]
define i2c_byte byte[3]
define i2c_out_bit bit[24]
define i2c_in_bit bit[17]
define i2c_loop byte[4]

define servo_number byte[5]
define servo_position byte[6]
'*******************************************'
'**************** CONSTANTS ****************'
define sd20_i2c_address 194
'*******************************************'
'****************** SETUP ******************'

'*******************************************'
'***************** PROGRAM *****************'
#start

servo_number = 1
if (servo_number = 0) or (servo_number > 20) then goto start

servo_position = 200
gosub sd20_servo_driver
goto start

....and the rest of your program...

Drifter2006
24.07.2007, 21:32
Hi,
Please try the original software first (with your port numbers).
If this works then we can work from there.
Greetings,
Drifter2006

nighteagle
24.07.2007, 22:58
I don`t understand? This is the original-code?
but is doesn´t work! Then i have usally change the code with my port numbers.. no success!

and the i deleted the print function... because the querys of servo number and position were replaced with static number and position!?

I haven´t any keyboard or Display on the Starter-Board with the C-Control 1 unit!

The simulator hang on this line:
if not scl then goto write_byte_i2c_clock_stretch
mfg O:)

I use Conrad CControl/CCBasic 2.0 IDE

nighteagle
25.07.2007, 11:46
Ohh..

A big mistake from me... i need a Terminalprogramm to use your code, ahh i understand what you mean! OK!
Any Servo drive to the Position i set on the terminal.
It is in function... now i want to set static Servonumbers and positions to automate a Moving-System without a Terminal-Program.

How are the settings on your program to implement this automatic-moves for the servos?

thanx

Drifter2006
25.07.2007, 16:27
Hello,
If I understand correctly, the software is working.
Lets try something.
You will still need the terminal program for this test.
The test will use servo 1 and servo 3
Try the code below and let me know what the servos are doing and if the terminal program displays:
********************
* No ACK from SD20 *
********************
Greetings,
Drifter2006


'**************** I/O PORTS ****************'
define sda port[7]
define scl port[8]
'*******************************************'
'**************** A/D PORTS ****************'

'*******************************************'
'**************** D/A PORTS ****************'

'*******************************************'
'**************** VARIABLES ****************'
define control_flags byte[1]
define i2c_nack bit[1]
define i2c_last bit[2]
define i2c_nack_count byte[2]
define i2c_byte byte[3]
define i2c_out_bit bit[24]
define i2c_in_bit bit[17]
define i2c_loop byte[4]

define servo_number byte[5]
define servo_position byte[6]
'*******************************************'
'**************** CONSTANTS ****************'
define sd20_i2c_address 194
'*******************************************'
'****************** SETUP ******************'

'*******************************************'
'***************** PROGRAM *****************'
#start
servo_number = 1
servo_position = 255
gosub sd20_servo_driver

servo_number = 3
servo_position = 255
gosub sd20_servo_driver

servo_number = 1
servo_position = 1
gosub sd20_servo_driver

servo_number = 3
servo_position = 1
gosub sd20_servo_driver

goto start
'*******************************************'
'*************** SUBROUTINES ***************'
#sd20_servo_driver
gosub start_i2c
i2c_byte = sd20_i2c_address : gosub write_byte_i2c
i2c_byte = servo_number : gosub write_byte_i2c
i2c_byte = servo_position : gosub write_byte_i2c
gosub stop_i2c
if i2c_nack_count > 9 then goto no_ack_from_sd20
if i2c_nack then goto sd20_servo_driver
return

#start_i2c
sda = 0 : scl = 0
return

#stop_i2c
sda = 0 : deact scl : deact sda
return

#write_byte_i2c
for i2c_loop = 1 to 8
sda = i2c_out_bit
deact scl
#write_byte_i2c_clock_stretch
if not scl then goto write_byte_i2c_clock_stretch
scl = 0
i2c_byte = i2c_byte shl 1
next
deact sda
deact scl
#write_byte_i2c_ack_clock_stretch
if not scl then goto write_byte_i2c_ack_clock_stretch
i2c_nack = sda
scl = 0
if i2c_nack then goto i2c_error
i2c_nack_count = 0
return
#i2c_error
i2c_nack_count = i2c_nack_count + 1
goto stop_i2c

#read_byte_i2c
i2c_last = 0
#get_i2c_byte
deact sda
for i2c_loop = 1 to 8
deact scl
#read_byte_i2c_clock_stretch
if not scl then goto read_byte_i2c_clock_stretch
i2c_in_bit = sda
scl = 0
if i2c_loop < 8 then i2c_byte = i2c_byte shl 1
next
if i2c_last then deact sda else sda = 0
deact scl
#read_byte_i2c_ack_clock_stretch
if not scl then goto read_byte_i2c_ack_clock_stretch
scl = 0
return

#read_last_byte_i2c
i2c_last = 1
goto get_i2c_byte
'*******************************************'
'******* INITIALIZATION SUBROUTINES ********'

'*******************************************'
'********* CALIBRATION SUBROUTINES *********'

'*******************************************'
'****************** DATA *******************'

'*******************************************'
'************* ERROR MESSAGES **************'
#no_ack_from_sd20
print"********************"
print"* No ACK from SD20 *"
print"********************"
pause 50
return
'*******************************************'

nighteagle
25.07.2007, 19:51
Hmmm. ..very big surprise... all servos in function...

Hmm...i don't know what are the problems on the beginning of this thread.

I had the same code you send in the last answer, to set static Servo-Number and position, but there were not in function and now.... it works.

daftly affairs O:)

Thanx for your very good explanation!

Borris

Drifter2006
26.07.2007, 15:30
Hello nighteagle,
Great to hear its working! \:D/
There must have been a loose connection somewhere.
Success with your project!
Greetings,
Drifter2006