code: func (s *SpheroDriver) Start() (err error) {
  	go func() {
  		for {
  			packet := <-s.packetChannel
  			err := s.write(packet)
  			if err != nil {
  				s.Publish(Error, err)
  			}
  		}
  	}()
  
  	go func() {
  		for {
  			response := <-s.responseChannel
  			s.syncResponse = append(s.syncResponse, response)
  		}
  	}()
  
  	go func() {
  		for {
  			header := s.readHeader()
  			if len(header) > 0 {
  				body := s.readBody(header[4])
  				data := append(header, body...)
  				checksum := data[len(data)-1]
  				if checksum != calculateChecksum(data[2:len(data)-1]) {
  					continue
  				}
  				switch header[1] {
  				case 0xFE:
  					s.asyncResponse = append(s.asyncResponse, data)
  				case 0xFF:
  					s.responseChannel <- data
  				}
  			}
  		}
  	}()
  
  	go func() {
  		for {
  			var evt []uint8
  			for len(s.asyncResponse) != 0 {
  				evt, s.asyncResponse = s.asyncResponse[len(s.asyncResponse)-1], s.asyncResponse[:len(s.asyncResponse)-1]
  				if evt[2] == 0x07 {
  					s.handleCollisionDetected(evt)
  				} else if evt[2] == 0x03 {
  					s.handleDataStreaming(evt)
  				}
  			}
  			time.Sleep(100 * time.Millisecond)
  		}
  	}()
  
  	s.ConfigureCollisionDetection(DefaultCollisionConfig())
  	s.enableStopOnDisconnect()
  
  	return
  }
docs: // Start starts the SpheroDriver and enables Collision Detection.
  // Returns true on successful start.
  //
  // Emits the Events:
  // 	Collision  sphero.CollisionPacket - On Collision Detected
  // 	SensorData sphero.DataStreamingPacket - On Data Streaming event
  // 	Error      error- On error while processing asynchronous response