Q:

Error "Cannot add foreign key constraint" al relacionar dos campos varchar

Estoy aprendiendo sobre bases de datos relacionales y tengo un problema a la hora de relacionar dos tablas con una auxiliar con una relacion de muchos a muchos.
Estoy intentando relacionar dos tablas que tienen un campo varchar como clave primaria generando una tabla auxiliar pero me da error Cannot add foreign key constraint
Tengo una serie de dudas:
1º ¿Es posible hacer esta relación con un tipo de campo varchar? lo he probado cambiando los campos por INT y si funciona correctamente.
2º He probado a relacionar una tabla con otra de 1 a muchos y con el tipo de dato varchar si funciona.
Adjunto imagen del modelo.

Gracias y un saludo.
EDIT1:
Copio la creación se la sentencia.
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema inver
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema inver
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `inver` DEFAULT CHARACTER SET utf8 ;
USE `inver` ;

-- -----------------------------------------------------
-- Table `inver`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `inver`.`users` (
  `id_user` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL DEFAULT NULL,
  `surname` VARCHAR(45) NULL DEFAULT NULL,
  `email` VARCHAR(45) NULL DEFAULT NULL,
  `password` VARCHAR(230) NULL DEFAULT NULL,
  `role` VARCHAR(45) NULL DEFAULT NULL,
  PRIMARY KEY (`id_user`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

-- -----------------------------------------------------
-- Table `inver`.`greenhouse`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `inver`.`greenhouse` (
  `fiwareServicePath` VARCHAR(45) NOT NULL,
  `metros` VARCHAR(45) NULL,
  `lugar` VARCHAR(45) NULL,
  `users_id_user` INT(11) NOT NULL,
  INDEX `fk_greenhouse1_users1_idx` (`users_id_user` ASC),
  PRIMARY KEY (`fiwareServicePath`),
  CONSTRAINT `fk_greenhouse1_users1`
    FOREIGN KEY (`users_id_user`)
    REFERENCES `inver`.`users` (`id_user`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `inver`.`sensors`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `inver`.`sensors` (
  `entityId` VARCHAR(45) NOT NULL,
  `sensor_name` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NULL DEFAULT NULL,
  PRIMARY KEY (`entityId`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_spanish_ci;

-- -----------------------------------------------------
-- Table `inver`.`sensors_has_greenhouse`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `inver`.`sensors_has_greenhouse` (
  `sensors_entityId` VARCHAR(45) NOT NULL,
  `greenhouse_fiwareServicePath` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`greenhouse_fiwareServicePath`, `sensors_entityId`),
  INDEX `fk_sensors_has_greenhouse_greenhouse1_idx` (`greenhouse_fiwareServicePath` ASC),
  INDEX `fk_sensors_has_greenhouse_sensors1_idx` (`sensors_entityId` ASC),
  CONSTRAINT `fk_sensors_has_greenhouse_sensors1`
    FOREIGN KEY (`sensors_entityId`)
    REFERENCES `inver`.`sensors` (`entityId`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_sensors_has_greenhouse_greenhouse1`
    FOREIGN KEY (`greenhouse_fiwareServicePath`)
    REFERENCES `inver`.`greenhouse` (`fiwareServicePath`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_spanish_ci;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

EDIT2
Añado el error:
Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
SQL Code:
        -- -----------------------------------------------------
        -- Table `inver`.`sensors_has_greenhouse`
        -- -----------------------------------------------------
        CREATE TABLE IF NOT EXISTS `inver`.`sensors_has_greenhouse` (
          `sensors_entityId` VARCHAR(45) NOT NULL,
          `greenhouse_fiwareServicePath` VARCHAR(45) NOT NULL,
          PRIMARY KEY (`greenhouse_fiwareServicePath`, `sensors_entityId`),
          INDEX `fk_sensors_has_greenhouse_greenhouse1_idx` (`greenhouse_fiwareServicePath` ASC),
          INDEX `fk_sensors_has_greenhouse_sensors1_idx` (`sensors_entityId` ASC),
          CONSTRAINT `fk_sensors_has_greenhouse_sensors1`
            FOREIGN KEY (`sensors_entityId`)
            REFERENCES `inver`.`sensors` (`entityId`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION,
          CONSTRAINT `fk_sensors_has_greenhouse_greenhouse1`
            FOREIGN KEY (`greenhouse_fiwareServicePath`)
            REFERENCES `inver`.`greenhouse` (`fiwareServicePath`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB
        DEFAULT CHARACTER SET = utf8
        COLLATE = utf8_spanish_ci

SQL script execution finished: statements: 8 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

A:

El error es que las tablas relacionadas no tienen la misma propiedad COLLATE. 
La documentación dice lo siguiente al respecto:

Corresponding columns in the foreign key and the referenced key must
  have similar data types. The size and sign of integer types must be
  the same. The length of string types need not be the same. For
  nonbinary (character) string columns, the character set and collation
  must be the same.

Las columnas correspondientes en la clave externa y la clave a la que se hace referencia deben tener tipos de datos similares. El tamaño
  y el signo de los tipos enteros deben ser iguales. La longitud de los
  tipos string no tiene que ser la misma. Para las columnas de cadena
  no binarias (caracteres), el conjunto de caracteres (CHARSET) y la
  intercalación (COLLATE) deben ser iguales.
Fuente: Documentación de MySQL. 
  (La traducción y las negritas son mías.)

Así la tablas:
sensors y sensors_has_greenhouse tienen el siguiente COLLATE en el CREATE TABLE: 
COLLATE = utf8_spanish_ci

Pero sensors_has_greenhouse se relaciona con la tabla greenhouse, que no tiene COLLATE = utf8_spanish_ci.
Dos columnas no binarias (columnas del tipo String como lo es VARCHAR) no pueden participar de una relación entre tablas si tienen diferente COLLATE. Eso es precisamente lo que ocurre en tu caso.
Solución
O bien le otorgas COLLATE = utf8_spanish_ci a la tabla greenhouse  (y a users, porque si no tendrias el mismo problema entre estas últimas dos), o bien le quitas el COLLATE = utf8_spanish_ci a las dos tablas que lo tienen.
He hecho una prueba de concepto corrigiendo esos detalles y no me ha arrojado el error: 

Cannot add foreign key constraint

¿Qué pasa si aún así sigue fallando?
Dado que has estado ejecutando un CREATE TABLE anteriormente, puede que alguna de las tablas ya se haya creado, antes de que la creación de las relaciones fallase. Entonces tienes varias posibilidades. 
La más simple, si tus tablas son nuevas y no tiene ya datos, sería ejecutar un DROP TABLE IF EXISTS ...nombre-de-tabla... de cada una de ellas, antes del CREATE TABLE para empezar de nuevo. Pero ejecuta eso una sola vez, para prevenir que tus tablas se crean todas de nuevo con la configuración correcta.
O bien puedes modificar el COLLATE mediante otro tipo de consulta como ALTER TABLE, o directamente en la interfaz gráfica de tu DBMS.
Nota:
Por lo general no es recomendable relacionar las tablas usando columnas del tipo VARCHAR. Para hacerlo debes estar muy seguro de que ese valor representa de manera única cada registro. Y tienen que evaluar también el costo que eso puede suponer en cuanto al rendimiento de la base de datos.

A:

Utiliza siempre las relaciones con un identificador numérico, es mucho mejor a la hora de ordenar los datos en la tabla N-M. Sí que es posible, como te han indicado, pero no es lo más recomendable, amén de que no tendría mucha lógica ya que tú quieres que al ver esa tabla haya un orden lógico de los datos, y eso lo consigues ordenando esa relación con una ID que aglutine ambas claves foráneas.
Un ejemplo rápido que tengo por ahí de tabla N-M:
CREATE DATABASE IF NOT EXISTS `ra33` DEFAULT CHARACTER SET latin1 COLLATE 
latin1_swedish_ci;
USE `ra33`;

CREATE TABLE `empresas` (
  `id` int(10) UNSIGNED NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `direccion` varchar(50) NOT NULL,
  `telefono` varchar(50) NOT NULL,
 `fundacion` date NOT NULL,
  `tipo` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `empresa_producto` (
  `id_empresa` int(10) UNSIGNED DEFAULT NULL,
  `id_producto` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `productos` (
  `id` int(10) UNSIGNED NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `precio_base` float NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

