RaspberryPiRoboter

From Ghoulwiki
Revision as of 22:12, 1 February 2015 by Ghoulsblade (talk | contribs) (i2c protocol notes)
Jump to: navigation, search

Info

Plan : 4/6-beinige Spinne mit RaspberryPi als Steuereinheit, Webcam, ferngesteuert via UMTS/LTE stick, Offroad gelände (noch nicht fertig)

  • Beine 2 gleidrig
    • 1 achse zw Unterschenkel und Oberschenkel
    • 2-3 achsen Obersch. zu Körper
    • Beine lang,dünn,leicht, z.b. dünne stange aus metall oder holz
    • Beine ca 0.5-1m lang, stelzende bewegung
  • Outdoor verwendung, z.b. wiese, waldboden, also mittelschweres-schweres gelände mit hindernissen und pflanzenfasern die räder oder raupen antriebe nicht passieren können
  • treppensteigen sollte auch möglich sein
  • webcam + umts stick für fernsteuerung
  • später dickere plastiktüten-hülle um körper für schutzt gegen regen
  • evtl solarzelle
  • gewicht ca 2-5kg bei 4 beinen mit je 30+40cm = theoretisch ca 150cm spannweite mit voll ausgestreckten beinen, in praxis aber immer gewinkelt
  • lowbudget projekt, ziel < 10 Euro pro achse(Motor+Getriebe+Sensor) (4 beine mit je 1+3 achsen = 16 motoren)
    • gleichstrom motoren mit "getriebe"/übersetzung durch mechanik statt schrittmotoren, ca 3-5 euro / motor
  • materialkosten spinne inklusive raspberry+webcam und batterien vorraussichtlich unter 300 euro
  • siehe auch RaspberryPiRoboter-archiv

Gallery

Hauptprobleme

Motoren

Lowbudget, 4 Beine a 1+3 achsen -> 16 Motoren, also vermutlich Gleichstrom Motoren

Gewinde

  • statt getriebe aus zahnrädern (teuer,kaum verfügbar) werden gewindestangen verwendet, billige meterware im baumarkt, versch. steigung(feingewinde)
  • querverstrebung zwischen ober+unterschenkel ähnlich muskel, abstand der befestigung zum knie/achse bestimmt tradeoff schnell vs kraftvoll
  • http://de.wikipedia.org/wiki/Metrisches_ISO-Gewinde
  • führung mit kippbar gelagerter mutter

Auslenkungserkennung der Beine

  • IR lichtschranke: an scheibe an gewindestange, 10 IR-LED+sensor paare für €1 pollin -> detect auf PIC chips, zähler mit i2c an raspberry pollbar
  • kontakt bei gewindestange zur regelmässigen justierung einmal pro durchlauf. bei zahnrad+schnecke an gewindestange auch am zahnrad.

Ideen :

  • verbrauchs-strom-messung der motoren
  • regelmässige korrektur mit drehbarer webcam
  • gefederte normalhaltung und motoren nur für auslenkung -> kein strom -> null position
  • mausrad-sensor verbauen (1 kugel maus mit wheel = 3 sensoren -> 5-6 mäuse)

Energie : Batterie + Solar

funkverbindung

  • optional da umts-stick genutzt werden kann, aber interessant
  • wiki: Richtfunkantennen lassen sich bei Sichtkontakt mehrere Kilometer überbrücken. Rekorde bis zu hundert Kilometer
  • schobi longrange bluetooth bis 1km bei sichtverbindung

PIC features

  • matrix at http://www.microchip.com for 8/16/32bit
  • I2C bus <-> raspberry comm
  • ADC,DAC,PWM,timer,USB,Ethernet,watchdog,
  • segment LCD
  • ICSP programming, JTAG, single wire debug
  • Configurable Logic Cell (CLC) : programmable combinational and sequential logic (also flipflop!, Operation while in Sleep), on-chip interconnection of peripherals and I/O micro e.g. PIC16F1713,
  • Zero Cross Detect : AC signal crosses through the ground potential, e.g. audio, wave.. micro e.g. PIC16F1703
  • Slope compensation : powersupply micro
  • CTMU Charge Time Measurement Unit (CTMU) e.g. PIC24F08KM202
  • Input Capture (interrupt) !!!! e.g. PIC24FJ16GA002 example
  • CWG complementary waveform generator micro
  • PSMC Programmable Switch Mode Controller : PWM, motor,power... micro
  • nanoWatt (power saving, hibernate)

Bauteil beschaffung

i2c protocol notes

// first draft version for testing i2c with one motor and IR sensor counting motor rotations
char cmd = (c >> 4);    // hi nibble
char x   = (c & 0x0f);      // low nibble
switch (cmd)
{
	// read
	case 0xA:
		DEBUG_SET_RC3
		switch (x)
		{
			case 0x0: i2c_mysend = 42; break; // ultimate answer
			case 0x1: i2c_mysend = 0x01; break; // version
			case 0x2: i2c_mysend = i2c_lastdata; break; // echo last command for i2c testing
			case 0x3: i2c_mysend = gMyCounter; break; // gMyCounter
			case 0x4: i2c_mysend = gMySensor; break; // gMySensor
			case 0x5: i2c_mysend = gTimeout; break; // gTimeout
                        case 0x6: i2c_mysend = gCommandExecLater; break; // command buffer, do not send new commands if this is different from COMMAND_NONE=0xff
			default: i2c_mysend = 0; break; // unknown
		}
	break;
	default: i2c_mysend = 0; gCommandExecLater = c; break; // see ExecCommandMainThread
}

// outside interrupt: ExecCommandMainThread:
switch (cmd)
{
	// start/stop motor commands
	case 0x0: a = (x==0)?0:1; // 0=stop
			  gMainActive = a; MAIN_MOTOR_PIN = a; gMyCounter = 0; gMyCounterEnd = x;        gMySensor = 0; gMySensorTarget = SENSOR_IGNORE; break; // motor duration
	case 0x1: gMainActive = 1; MAIN_MOTOR_PIN = 1; gMyCounter = 0; gMyCounterEnd = x*10;     gMySensor = 0; gMySensorTarget = SENSOR_IGNORE; break; // motor duration x 10
	case 0x2: gMainActive = 1; MAIN_MOTOR_PIN = 1; gMyCounter = 0; gMyCounterEnd = gTimeout; gMySensor = 0; gMySensorTarget = x; break;    // motor sensor
	case 0x3: gMainActive = 1; MAIN_MOTOR_PIN = 1; gMyCounter = 0; gMyCounterEnd = gTimeout; gMySensor = 0; gMySensorTarget = x*10; break; // motor sensor x 10
	case 0x4: gMainActive = 1; MAIN_MOTOR_PIN = 1; gMyCounter = 0; gMyCounterEnd = gTimeout; gMySensor = 0; gMySensorTarget = x*100; break; // motor sensor x 100

	// config commands
        case 0x6: gPortCMode = x; break; // PORTC "LEDS" 0=reserved, 1=counter, 2=sensor, 3=counter-mod8-circle-LEDs 4=like 3 but slower
	case 0x7: gMotorSpeed = x; break; // full speed = 0x0f   (motor on if (c & mask) <= speed, ~16msec cycle)
	case 0x8: gTimeout = x; break;    // set timeout
	case 0x9: gTimeout = x*10; break; // set timeout x 10
}

einkaufslisten

reichelt 2015-02

  • schwarze feine litze (IR-sensor <-> stecker)
  • sortimentkasten

links