RaspberryPiRoboter

From Ghoulwiki
Revision as of 00:38, 7 February 2015 by Ghoulsblade (talk | contribs) (reichelt 2015-02)
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

// draft version for testing i2c with one motor and IR sensor counting motor rotations
// I2C: rpi sends 1 byte, gets 1 byte in return (0 for commands)
// commands other than read are handled outside interrupt, 
// wait at least 2*gStepCycleLen*100usec or until read 0xA6=gCommandExecLater returns 0xFF=COMMAND_NONE before sending next or it might be cancelled

defaults:
#define COMMAND_NONE 0xFF
uint gTimeout           = 800; // 6.4ms * 800 = ca 5sec
char gPortCMode         = 2;
char gMotorSpeedMask    = 0xff; // 0xff = full speed
char gStepCycleLen      = 64; // ca 64 x 100us = 6.4ms

char cmd = (c >> 4);    // hi nibble
char x   = (c & 0x0f);      // low nibble

bool a;
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*10;     gMySensor = 0; gMySensorTarget = SENSOR_IGNORE; break; // motor duration x 10
	case 0x1: gMainActive = 1; MAIN_MOTOR_PIN = 1; gMyCounter = 0; gMyCounterEnd = x*100;    gMySensor = 0; gMySensorTarget = SENSOR_IGNORE; break; // motor duration x 100
	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:
		switch (x) {
			case 0x08: gMotorSpeedMask = 0xff; break; // 11111111 8/8 100%
			case 0x07: gMotorSpeedMask = 0xfe; break; // 11111110 7/8
			case 0x06: gMotorSpeedMask = 0xee; break; // 11101110 6/8 75%
			case 0x05: gMotorSpeedMask = 0xD5; break; // 10110101 5/8
			case 0x04: gMotorSpeedMask = 0xCC; break; // 10101010 4/8 50%
			case 0x03: gMotorSpeedMask = 0x92; break; // 10010010 3/8
			case 0x02: gMotorSpeedMask = 0x88; break; // 10001000 2/8 25%
			case 0x01: gMotorSpeedMask = 0x80; break; // 10000000 1/8

			case 0x0A: gMotorSpeedMask = 0xFC; break; // 11111100 special
			case 0x0B: gMotorSpeedMask = 0xF0; break; // 11110000 special
			case 0x0C: gMotorSpeedMask = 0xC0; break; // 11000000 special
			case 0x0D: gMotorSpeedMask = 0xCC; break; // 11001100 special
			default:   gMotorSpeedMask = 0xff; break; // full speed
		}
		break;
	case 0x8: gTimeout = x*10; break;  // set timeout x 10
	case 0x9: gTimeout = x*100; break; // set timeout x 100
	// 0xA = read (see interrupt!)
	case 0xB: gStepCycleLen = x; break; // 1 is a little more than 100usec, step gets called once per cycle, 100u x 64 = every 6.4msec
	case 0xC: gStepCycleLen = x*10; break;
}

// interrupt: read
case 0xA:
	switch (x)
	{
		case 0x0: i2c_mysend = 42; break; // ultimate answer
		case 0x1: i2c_mysend = 0x01; break; // version
		case 0x2: i2c_mysend = 0x00; break; // reserved
		case 0x3: i2c_mysend = (gMyCounter >> 4) & 0xff; break; // gMyCounter
		case 0x4: i2c_mysend = gMySensor; break; // gMySensor
		case 0x5: i2c_mysend = (gTimeout >> 4) & 0xff; break; // gTimeout
		case 0x6: i2c_mysend = gCommandExecLater; break; // command buffer, do not send new commands if this is different from COMMAND_NONE=0xff
		case 0x7: i2c_mysend = gMotorSpeedMask; break; // gMotorSpeedMask
		default: i2c_mysend = 0; break; // unknown
	}
break;

einkaufslisten

reichelt 2015-02

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

links