ComputerCraft real life turtle

  • The FTB Forum is now read-only, and is here as an archive. To participate in our community discussions, please join our Discord! https://ftb.team/discord

Shizz0

New Member
Jul 29, 2019
10
0
0
Hello everyone,

i just finished my trutle :)

Here it is...

Extras
https://www.dropbox.com/s/fa87ys9bzvtz6u8/computercraft_turtle_controlboard.jpg
https://www.dropbox.com/s/4acxrndepzf0k04/JD600037.JPG
PCB(target3001 file): https://www.dropbox.com/s/vdhwmbc7y8wanri/Hauptplatine_masse.T3001
code:
Code:
'Computer Craft Turtle
'Version: rl_2.0
'by Shizz0
 
$regfile = "m48pdef.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 64
$framesize = 128
 
' vars
 
Dim Text As String * 1
Dim Letter_count As Byte
Dim Attack_counter As Byte , Servo_counter As Byte
Dim Dance_enable As Bit , Attack_enable As Bit
Dim Gps(3) As Byte
Dim Sensor As Word , Sensor_m2 As Bit
 
Dim ___rseed As Word , Random As Word
 
' I/O
 
Config Pind.0 = Output                                      'Servo
 
Config Pinc.5 = Input                                      'Sensor
 
Config Pind.1 = Input
Button1 Alias Pind.1
Portd.1 = 1
 
Config Pind.2 = Input
Anykey Alias Pind.2
Portd.2 = 1
 
Config Portb.3 = Output                                    'OC2A M1
Config Portd.3 = Output                                    'OC2B M1
Config Portb.1 = Output                                    'OC1A M2
Config Portb.2 = Output                                    'OC1B M2
 
' const
 
Const Slowtext = 1                                          'sec
Const Typingspeed = 200                                    'ms
Const Fasttext = 30                                        'ms
Const Block = 1945                                          'ms/block@255
Const Block_turn = 754                                      'ms/90° turn@255
 
' lcd
 
Config Lcdpin = Pin , Db7 = Portc.4 , Db6 = Portc.3 , Db5 = Portc.2 , _
Db4 = Portc.1 , Rs = Portb.5 , E = Portc.0
 
Config Lcd = 16 * 2
 
' adc
 
Config Adc = Single , Prescaler = Auto , Reference = Avcc
 
' servo
 
Config Servos = 1 , Servo1 = Portd.0 , Reload = 10
 
' timer
 
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , _
Compare B Pwm = Clear Down , Prescale = 64
Enable Timer1
 
Config Timer2 = Pwm , Pwm = On , Compare A Pwm = Clear Down , _
Compare B Pwm = Clear Down , Prescale = 64
Enable Timer2
 
' ints
 
Config Int0 = Falling
Enable Int0
On Int0 On_int0
 
Enable Interrupts
 
' startup
 
Declare Sub Motor(byval Direction As Byte , Byval Speed As Byte)
Call Motor(5 , 0)
Wait 1
Call Motor(5 , 0)
Initlcd
Gosub Startingscreen
 
Wait 5
Call Motor(7 , 75)
Waitms 4800
Call Motor(7 , 0)
 
' main
 
Do
 
  Debounce Button1 , 0 , Dance , Sub
 
  If Attack_enable = 1 Then
      Gosub Attack
  End If
 
Loop
End
 
' subs
' ###########################################################################
'Test1:
'Wait 3
'Call Motor(2 , 255)
'Return
Fucking_random_dance:
 
Set Dance_enable
Gps(1) = 3
Gps(2) = 3
Gps(3) = 0
 
While Dance_enable = 1
  ___rseed = Tcnt0
  Random = Rnd(5)
 
  Select Case Random
 
      Case 0:
        Select Case Gps(3)
 
            Case 0:
              If Gps(2) > 1 Then
                  Decr Gps(2)
                  Call Motor(0 , 255)
              End If
            Case 1:
              If Gps(1) < 5 Then
                  Incr Gps(1)
                  Call Motor(0 , 255)
              End If
            Case 2:
              If Gps(2) < 5 Then
                  Incr Gps(2)
                  Call Motor(0 , 255)
              End If
            Case 3:
              If Gps(1) > 1 Then
                  Decr Gps(1)
                  Call Motor(0 , 255)
              End If
 
        End Select
 
      Case 1:
        Select Case Gps(3)
 
            Case 0:
              If Gps(2) < 5 Then
                  Incr Gps(2)
                  Call Motor(1 , 255)
              End If
            Case 1:
              If Gps(1) > 1 Then
                  Decr Gps(1)
                  Call Motor(1 , 255)
              End If
            Case 2:
              If Gps(2) > 1 Then
                  Decr Gps(2)
                  Call Motor(1 , 255)
              End If
            Case 3:
              If Gps(1) < 5 Then
                  Incr Gps(1)
                  Call Motor(1 , 255)
              End If
 
        End Select
 
      Case 2:
        If Gps(3) = 3 Then
            Gps(3) = 255
        End If
        Incr Gps(3)
        Call Motor(2 , 255)
 
      Case 3:
        If Gps(3) = 0 Then
            Gps(3) = 4
        End If
        Decr Gps(3)
        Call Motor(3 , 255)
 
      Case 4:
        Call Motor(5 , 0)
 
  End Select
 
Waitms 200
 
Wend
 
Return
' ###########################################################################
Sub Motor(byval Direction As Byte , Byval Speed As Byte)
 
  Select Case Direction
 
      Case 0:                                              '1 block fwd
        Pwm1a = Speed
        Pwm2a = Speed
        Waitms Block
        Pwm1a = 0
        Pwm2a = 0
      Case 1:                                              '1 block bwd
        Pwm1b = Speed
        Pwm2b = Speed
        Waitms Block
        Pwm1b = 0
        Pwm2b = 0
      Case 2:                                              '90° right
        Pwm1b = Speed
        Pwm2a = Speed
        Waitms Block_turn
        Pwm1b = 0
        Pwm2a = 0
      Case 3:                                              '90° left
        Pwm1a = Speed
        Pwm2b = Speed
        Waitms Block_turn
        Pwm1a = 0
        Pwm2b = 0
      Case 4:                                              'fwd
        Pwm1a = Speed
        Pwm2a = Speed
      Case 5:                                              'Servo
        For Servo_counter = 70 To 100
            Servo(1) = Servo_counter
            Waitms 3
        Next
        Waitms 100
        For Servo_counter = 100 To 70 Step -1
            Servo(1) = Servo_counter
            Waitms 3
        Next
        Waitms 100
      Case 6:                                              'turn left
        Pwm1a = Speed
        Pwm2b = Speed
      Case 7:                                              'turn right
        Pwm1b = Speed
        Pwm2a = Speed
  End Select
 
End Sub
' ###########################################################################
On_int0:
'NEVER run ADC, SERVO or PWM routines while the "return-adress" of an interrupt
'is on the HWstack !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  Reset Dance_enable
  Reset Attack_enable
  Reset Sensor_m2
  Gosub Startingscreen
  Waitms 500
 
  If Anykey = 0 Then
      Set Attack_enable
  End If
 
Return
' ###########################################################################
Attack:
 
Waitms 500
Start Adc
 
  For Letter_count = 0 To 5
      Text = Lookupstr(letter_count , Attack_text)
      Lcd Text
      Waitms Typingspeed
  Next
 
Wait 2
Call Motor(6 , 70)
Sensor_m2 = 1
 
  While Attack_enable = 1
      Sensor = Getadc(5)
 
      If Sensor >= 150 And Sensor_m2 = 1 Then
        Sensor_m2 = 0
        Call Motor(6 , 0)
        Wait 1
        Call Motor(4 , 70)
      Elseif Sensor >= 550 Then
        Attack_enable = 0
        Stop Adc
        Call Motor(4 , 0)
        Waitms 500
        Call Motor(5 , 0)
        Locate 2 , 9 : Lcd "-done"
        Wait 5
        Gosub Startingscreen
      End If
 
      Waitms 5
 
  Wend
 
Return
' ###########################################################################
Startingscreen:
 
Cursor Off Noblink
Cls
Lcd "TurtleOS 9000.1"
Locate 2 , 1
Lcd "> "
Cursor On Blink
 
Return
' ###########################################################################
Dance:
 
Waitms 500
If Button1 = 0 Then
 
  Wait 5
  Cls
  For Attack_counter = 1 To 10
      If Attack_counter <= 6 Then
        If Attack_counter = 4 Then
            Locate 2 , 1
        End If
        Lcd "KILL "
      End If
      Call Motor(5 , 0)
  Next
  Wait 2
  Gosub Startingscreen
 
Else
 
  Disable Int0
 
  For Letter_count = 0 To 27
 
        If Letter_count = 5 Then
            Wait 2
            Cls
            Cursor Off Noblink
            Locate 1 , 1
        Elseif Letter_count = 21 Then
            Locate 2 , 1
        End If
 
      Text = Lookupstr(letter_count , Dance_text)
      Lcd Text
 
        If Letter_count <= 4 Then
            Waitms Typingspeed
        Elseif Letter_count > 4 And Letter_count < 24 Then
            Waitms Fasttext
        Else
            Wait Slowtext
        End If
 
  Next
 
  Wait 2
  Cls
  Locate 1 , 1
  Lcd "Press any key to"
  Locate 2 , 1
  Lcd "stop the groove"
  Wait 1
 
  Enable Int0
 
  Gosub Fucking_random_dance
 
End If
 
Return
' ###########################################################################
'----------------
'----- data -----
'----------------
 
Dance_text:
Data "d" , "a" , "n" , "c" , "e"
Data "P" , "r" , "e" , "p" , "a" , "r" , "i" , "n" , "g" , " "
Data "t" , "o" , " "
Data "g" , "e" , "t"
Data "d" , "o" , "w" , "n" , "." , "." , "."
 
Attack_text:
Data "a" , "t" , "t" , "a" , "c" , "k"

PS: Oh yeah, i hate to fold paper now...

I hope you like it :D
 

Riuga

New Member
Jul 29, 2019
684
0
0
How long did it take you to make this?

Serious engineering right there.

Now go tweet this to dan200
 

RedBoss

New Member
Jul 29, 2019
3,300
0
0
You are REALLY into turtles. :p

Cool job. The turtle and sword look very well done. I can't say enough good things about your efforts.

Does your cat scare aware the creepers for you?
 

Riuga

New Member
Jul 29, 2019
684
0
0
This reminds me of my idea for an Applied Energistics Cake.

Ice for certus quartz and frozen milk for nether quartz :p